![](/img/trans.png)
[英]In terms of sys module dictionary, what happens when importing by using - package vs module?
[英]In terms of namespace, what happens when importing by using - package vs module?
我知道文件是模塊,帶有__init__.py
的文件夾是包。 我也知道有兩種導入方法:
對於模塊,第一種方法將整個模塊(功能/變量)加載到被調用的模塊名稱空間中。 而第二種方法將函數/變量加載到調用模塊的名稱空間中。 也稱為本地名稱空間,而前一個稱為全局名稱空間嗎?
這與使用軟件包而不是模塊有何不同? 我知道每次使用上面的選項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
的情況下,該函數/變量將加載到調用名稱空間(本地名稱空間?)中。
使用import
和from 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.