【发布时间】:2018-10-22 06:18:44
【问题描述】:
official python logging documentation 是这样说的:
名称可能是一个以句点分隔的层次值,例如 foo.bar.baz (尽管它也可能只是简单的 foo,例如)。 层次列表中更靠后的记录器是 列表中较高的记录器。例如,给定一个具有名称的记录器 foo 中,名称为 foo.bar、foo.bar.baz 和 foo.bam 的记录器是 foo 的所有后代。记录器名称层次结构类似于 Python包层次结构,如果你组织你的 使用推荐的结构基于每个模块的记录器 logging.getLogger(__name__)。那是因为在一个模块中, __name__ 是 Python 包命名空间中的模块名称。
但我发现最后一句话并不完全正确。 __name__ 的值似乎取决于模块的导入方式。下面证明了这一点:
给定两个模块, foo 和 bar 都在包 pkg 中:
这是foo:
def showFoosName():
print __name__
这是酒吧:
from pkg import foo
if __name__ == '__main__':
foo.showFoosName()
运行栏产生
pkg.foo
但是,如果我们将 baz 引入包 pkg 中,它将 foo 简单地作为 foo 导入,这是合法的,因为两者都在同一个包中:
import foo
if __name__ == '__main__':
foo.showFoosName()
运行 baz 产生
foo
现在将这个讨论带回到日志记录和日志记录配置,似乎 python 日志记录建议使用__name__ 命名记录器只有在包中的导入使用from pkg import bar 语法编码时才有效。这不是我所期望的。我原以为__name__ 的值与导入方式无关。
【问题讨论】:
-
如果您从
pkg目录启动baz.py,那么是 没有包pkg:在这种情况下pkg文件夹不是包,但是sys.path的根。这就是为什么您不应该在可导入包的文件夹结构中混入可执行脚本的原因之一。 -
@DanielPryden:鉴于报告的运行
bar的结果,我倾向于认为pkg既是一个包 又是一个sys.path条目,但是有还有其他可能性,例如bar实际上不在pkg中。无论如何,我同意将脚本与包的结构混合是应避免的。