gpt4 book ai didi

python - __name__ 的值从何而来?

转载 作者:太空狗 更新时间:2023-10-30 02:32:03 25 4
gpt4 key购买 nike

所以我有几个 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 的消息,反之亦然。所有路由都基于配置的记录器/处理程序,包括 apps. 部分或不。

那么 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__ 会直接反射(reflect)出来。如果您有时看到 apps.saml.xyz,那么您的模块是使用 那个 名称导入的,并且您的模块有两个副本加载到内存中; Python 认为两者是分开的。

你应该避免导入嵌套模块; 使用顶级名称。坚持使用 apps.saml.xyzsaml.xyz,但如果必须使用后者,请确保 apps/不是 一个包,它本身也没有列在 python 模块搜索路径 sys.path 中。

关于python - __name__ 的值从何而来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20359311/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com