繁体   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