簡體   English   中英

__name__的值來自哪里?

[英]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.xyzsaml.xyz ,但如果必須使用后者,請確保apps/ 不是包,並且本身不在python模塊搜索路徑sys.path列出。

暫無
暫無

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

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