【发布时间】:2023-03-31 21:55:02
【问题描述】:
我有这个设置:
main.py
/module
/module/__init__.py (empty)
/module.py
这是我的两个文件的代码,分别是 main.py 和 module.py:
main.py
import logging
from module import module
logger = logging.getLogger(__name__)
def test():
logger.warning('in main.py/test')
def main():
handler = logging.StreamHandler()
handler.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s %(name)s/%(module)s [%(levelname)s]: %(message)s', '%Y-%m-%d %H:%M:%S')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.warning('in main.py/main')
module.something()
if __name__ == "__main__":
main()
module.py
import logging
logger = logging.getLogger(__name__)
def something():
logger.warning('in module.py/something')
所以,我注意到这会输出以下内容(注意模块记录器如何没有格式):
2019-10-01 09:03:40 __main__/main [WARNING]: in main.py/main
in module.py/something
似乎只有在我在main.py 中进行编辑以将logger = logging.getLogger( __ name __ ) 更改为logger = logging.getLogger() 或在def main(): 之后添加logger = logging.getLogger() 之后它才会这样记录(即我想要什么):
2019-10-01 09:04:13 root/main [WARNING]: in main.py/main
2019-10-01 09:04:13 module.module/module [WARNING]: in module.py/something
这是为什么呢?我认为因为main.py 正在导入module.py,所以它在层次规模上自然更高,因此module.py 将继承main.py 中定义的记录器设置。是否需要在 main 中显式设置根记录器(使用logger = logging.getLogger())才能使继承工作?我没有正确配置我的文件夹结构以使module.py 的记录器继承main.py 的记录器设置,还是文件夹结构无关紧要?
我问的原因是因为我认为应该始终使用logger = logging.getLogger( __ name __ )(甚至在main.py),然后根据导入结构(或文件夹结构?),这将确定层次结构和记录器将相应地继承。我做出这个假设的原因是因为如果我将main.py 导入另一个程序会怎样?我想我的意思是,我想让日志记录尽可能通用,这样我就可以将一个模块导入另一个模块,并且它总是继承父级的记录器设置。有没有办法显示所有模块的底层层次结构以用于调试/学习?
【问题讨论】:
-
拥有一个名为
module.py的文件和一个包含__init__.py的同名目录(没有.py)不是一个好主意。可能你把自己和任何阅读代码的人都弄糊涂了。可能有一条规则,说明真正要导入的内容,但我认为这不是一个好主意。 -
代码确实有效,我并不觉得它特别令人困惑,举个例子,它确实突出了我试图传达的内容。我可以将它重命名为 module_folder,但它会弄乱下面的答案。我认为根据提供的信息,人们应该能够弄清楚......
-
令我困惑的不是代码,而是文件名,您有一个名为 module.py 的文件和一个名为 module 的目录,其中包含
__init__.py。我想大多数人都不知道如果您执行import module会查看什么文件。它会读取和编译module.py或module/__init__.py还是两者,如果两者都按什么顺序。如果您有from module import module,将查看什么文件。避免使用与目录同名的目录会更容易。但你是对的,你得到了答案。所以也许只有我。 -
更正:避免使用与 filename.py 同名的目录使其更容易。在我的机器上,
module/__init__.py被导入,module.py被忽略,所以我什至无法重现你的问题。
标签: python python-3.x inheritance logging hierarchy