在编写 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/