簡體   English   中英

在名稱空間方面,使用-包vs模塊導入時會發生什么?

[英]In terms of namespace, what happens when importing by using - package vs module?

我知道文件是模塊,帶有__init__.py的文件夾是包。 我也知道有兩種導入方法:

  • 導入x(x可以是包或模塊)
  • 從x導入y(x可以是包或模塊;如果x是包,則y可以是子包或模塊;如果x是package.module,則y可以是函數/變量

對於模塊,第一種方法將整個模塊(功能/變量)加載到被調用的模塊名稱空間中。 而第二種方法將函數/變量加載到調用模塊的名稱空間中。 也稱為本地名稱空間,而前一個稱為全局名稱空間嗎?

這與使用軟件包而不是模塊有何不同? 我知道每次使用上面的選項a或b導入包時都會調用_init__.py 但是在case a ,只有pkgname會加載到調用模塊的名稱空間(本地名稱空間?)中。 在調用/被調用的程序包名稱空間中不會加載任何模塊(除非init文件已導入模塊); 而在case b ,是否將特定的模塊/變量加載到調用的名稱空間(全局名稱空間?)中? 我想是的,如果它from package import module (本地名稱空間?)。 否,如果它是from package import anotherpackage (取決於該包是否具有帶有導入的init文件,就像前面的示例一樣)。 from package.module import function/variable的情況下,該函數/變量將加載到調用名稱空間(本地名稱空間?)中。

使用importfrom import時,我對名稱空間的調用方(本地)和調用方(全局)的理解正確嗎?

從技術上講, ___init__.py在Python 3.4之后不再是必需的。 但是建議您使用它。 要回答您的問題,如果您執行的是僅導入文件的幼稚導入,則該模塊/程序包中的所有內容都會加載到名稱空間中。 對於使用from語法的特定導入,將加載特定的類/函數。 區別在於,對於包而言,如果__init__.py中有任何代碼會自動加載到名稱空間中。 假設您有一個使用模塊名稱進行記錄的記錄器,

def get_module_logger(name=None):
    default = "__app__"
    logging.basicConfig(
        level=logging.INFO,
        format="%(asctime)s [%(threadName)-12.12s] [%(levelname)-5.5s]  %(message)s",
        handlers=[
            logging.FileHandler("logs/run_{}.log".format(str(datetime.today().strftime('%Y-%m-%d')))),
            logging.StreamHandler()
        ])
    logger = logging.getLogger(name) if name else logging.getLogger(default)
    return logger

可以使用以下命令在包中的任何模塊中調用它:

import get_module_logger

可以使用以下代碼在代碼中的任何位置進行引用:

logger = get_module_logger(__name__)

現在,記錄器已綁定到程序包名稱空間,希望對您有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM