gpt4 book ai didi

python - 在 python 中创建模块范围的记录器是好的设计吗?

转载 作者:太空狗 更新时间:2023-10-30 00:52:18 26 4
gpt4 key购买 nike

在编写 python 代码时,我经常使用日志记录模块。

在经历了一些糟糕的经历并阅读了类似 this one 的文章之后, 我尽量避免导入时执行代码。

但是,为了简单起见,我倾向于在模块文件的开头获取我的日志记录对象:

# -*- coding: utf-8 -*-
import logging
logger = logging.getLogger('product.plugin.foo.bar')

这样,我的记录器就可以全局访问了,我可以在任何地方写“logger.error()”。另一种方法是在类范围内创建它:

class Bar(object):
logger = logging.getLogger('product.plugin.foo.bar')

但是,现在我每次都必须输入类名。为了避免键入类名,我很想改用“self”,这在静态方法中会失败。

    def my_method(self):
Bar.logger.error('foo')

def my_method_2(self):
self.logger.error('foo') # ok...

@staticmethod
def my_method_2():
self.logger.error('foo') # boom!

所以,起初,看起来在模块范围内创建记录器对象似乎是正确的做法 - 仍然感觉我这样做时可能会遇到与导入相关的麻烦...

最佳答案

没关系。我什至使用相同的变量名 logger。任何日志记录都比没有日志记录好,但我发现公开记录器变量是一种很好的做法,将模块隐藏起来,这样您的代码只引用记录器,因此您指定的命名空间模块。

如果您稍后需要为模块中的代码优化命名空间,您可以在这些类中使用 self.logger,或者在必要时隐藏全局记录器。

更新0

__all__ = [anything but logger]
import logging
logger = logging.getLogger("why.is.this.method.still.java.camel.case")
del logging

注意到 S.Lott 在下面的贡献。另请注意,通常您不希望 from x import *

关于python - 在 python 中创建模块范围的记录器是好的设计吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3502558/

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