[英]Where does the value for __name__ come from?
所以我有幾個django設置文件,一個用於測試,另一個用於不同的客戶。
這些設置文件都不會更改sys.path
。
所有這些都包含一個包含INSTALLED_APPS
的單一基本設置文件。
大多數文件都有代碼執行此操作:
import logging
logger = logging.getLogger(__name__)
logger.error("Something went wrong")
在我的測試設置文件中,模塊__name__
看起來像saml.xyz
所以logger.name是saml.xyz
但是當我使用不同的設置文件時,模塊__name__
看起來像apps.saml.xyz
,這使得logger.name apps.saml.xyz
。
這會導致錯過某些日志消息,因為處理程序連接到錯誤的位置。 saml.xyz
的處理程序不會獲取apps.saml.xyz
消息,反之亦然。 所有路由都基於配置的記錄器/處理程序,包括應用程序。 部分與否。
那么python如何決定哪個__name__
給出一個文件,以及我的不同設置文件如何在不改變sys.path的情況下影響__name__
呢?
命令在其他方面是相同的:
python manage.py test --settings=projectname.test saml
產量
>>> logger.name
'saml.xyz'
要么
python manage.py test --settings=projectname.customer saml
產量
>>> logger.name
'apps.saml.xyz'
__name__
是導入當前模塊的名稱。
如果模塊是使用import saml.xyz
,則__name__
會直接反映該模塊。 如果您有時看到apps.saml.xyz
那么您的模塊是使用該名稱導入的,並且在內存中加載了兩個模塊副本; Python認為這兩者是分開的。
您應該避免導入嵌套模塊; 僅使用頂級名稱。 堅持使用apps.saml.xyz
或saml.xyz
,但如果必須使用后者,請確保apps/
不是包,並且本身不在python模塊搜索路徑sys.path
列出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.