【发布时间】:2016-12-21 12:24:41
【问题描述】:
我很懒,想在每个使用日志记录的 python 文件中避免这一行:
logger = logging.getLogger(__name__)
1 月份我询问了如何做到这一点,并找到了答案:Avoid `logger=logging.getLogger(__name__)`
不幸的是,那里的答案有一个缺点,就是你失去了过滤的能力。
我真的很想避免这种无用和多余的行。
例子:
import logging
def my_method(foo):
logging.info()
不幸的是,如果 logging.info() 在此文件中第一次被调用,我认为不可能隐式执行 logger = logging.getLogger(__name__)。
有没有人知道如何做不可能的事情?
更新
我喜欢Don't Repeat Yourself。如果大多数文件在顶部包含同一行,我认为这是重复。它看起来像WET。每次我看那里时,我脑海中的 python 解释器都需要跳过这一行。我的主观感受:这条线是没用的臃肿。该行应该是隐式默认值。
【问题讨论】:
-
在模块顶部定义一行真的那么难吗?您已经必须输入
import logging。 -
@MartijnPieters 我没有输入“导入日志”。我有一个 IDE 可以做到这一点。我在方法中键入“logging.[MAGIC-KEY-STROKE]”,IDE 在顶部插入导入语句。是的,我不想输入这一行。肿了我想要更少的代码,而不是更多。
-
不是臃肿;这是一个明确的声明,您想要一个具有该名称的记录器对象。如果您不关心名称,则可以在包中为所有子模块重用该记录器。您可以轻松地使用不同的名称层次结构。此外,其他任何事情都需要具有自定义
__getattr__的自定义模块子类,然后检查调用框架中的全局变量中的__name__键以生成相同的对象。 Python 更喜欢显式而不是这种魔法。 -
如果您使用的是 IDE,那么它可能是 IDE 为您做的事情。也许它具有自动扩展的 sn-p 支持?您键入
logger<TAB>并为您插入导入和getLogger(__name__)调用?这不是 Python 必须为您解决的问题。 -
@MartijnPieters 你说“这不是臃肿”。我更新了问题。请参阅“更新”。但我认为我添加的这一段并没有添加任何实质性内容。