Python 避免检查记录器是否存在

Python 避免检查记录器是否存在,python,logging,nonetype,Python,Logging,Nonetype,像这样在python中使用日志时 import logging logging.basicConfig(level=logging.INFO) logger = None if <some condition>: logger = logging.getLogger(__name__) ... some code ... logger.debug('message') 导入日志 logging.basicConfig(级别=logging.INFO) 记录器=无 如果: lo

像这样在python中使用日志时

import logging
logging.basicConfig(level=logging.INFO)
logger = None
if <some condition>:
   logger = logging.getLogger(__name__)
... some code ...
logger.debug('message')
导入日志
logging.basicConfig(级别=logging.INFO)
记录器=无
如果:
logger=logging.getLogger(_名称__)
... 一些代码。。。
logger.debug('消息')

如果没有
if
语句,就不存在
logger.debug
,是否可以避免调用它?

您可以构造一个包装器对象并在任何地方使用它:

class LoggerWrapper(object):

    def __init__(self, logger):
        self.logger = logger

    def debug(self, *args, **kwargs):
        if self.logger is None:
            return
        self.logger.debug(*args, **kwargs)

my_wrapper = LoggerWrapper(logger)
my_wrapper.debug('message')
尽管如此,这并不是Python的日志模块所特有的。任何变量
var
也可以是
None
,在调用该变量的方法(
var.method()
)之前,都需要对其进行检查

始终定义日志记录程序和通过日志记录配置/设置禁用日志记录可能更容易。这样可以保持代码干净,所有记录器调用都会成功,但如果禁用特定记录器,则输出不会有任何结果

最后,您可以选择使用if语句,因为它本身并没有那么多代码:

if logger:
    logger.debug('message')
如果logger.debug不存在且没有if语句,是否可以避免调用它

嗯,你可以(ab)使用
if
表达式,或者
表达式,或者其他各种东西,但除此之外,实际上不是这样

但是,您始终可以编写包装器函数:

def logdebug(*args):
    if logger:
        logger.debug(*args)

logdebug('message')
logdebug('other message')

你可以做其他类似的把戏。例如,您可以创建一个对象,而不是使用
logger=None
,该对象具有不执行任何操作的
debug
方法:

class Dummy(object):
    def debug(self, *args): pass
logger = Dummy()

或者,更好的做法是,始终创建一个日志记录程序并使用空处理程序对其进行配置,或者最简单的方法是将其日志记录级别设置为高于调试级别


但是请注意,所有这些都不会完全取代
if
语句。例如,考虑:

if logger:
    logger.debug(very_expensive_function())

logdebug(very_expensive_function())

如果您确实需要日志消息,第一个将只调用
非常昂贵的函数
,以创建日志消息;第二种方法总是调用它,如果你不需要它,就把它扔掉。

这不是你使用日志的方式:它完全没有抓住要点。关键是始终只记录日志,然后(在应用程序级别)适当地配置处理程序,以便它们记录调试级别或不记录调试级别。您的应用程序级配置甚至可以为每个模块中的记录器设置处理程序。有关更多信息,请参阅Python日志记录文档。

你是对的,但有时你可能不想在应用程序中使用日志记录,因此没有应用程序级别。例如,在独立服务中使用日志记录。在这种情况下,可能会复制日志记录程序,这是不可取的。例如,如果您正在开发一个不应包含自己的日志记录配置的库,那么这种方法是没有帮助的。消费者应用程序或客户端将安装库,其日志记录语句将自动与客户端选择的日志配置配合使用。那么,你们为图书馆自身的地方发展做些什么呢?您可能希望执行一段代码,该代码不应定义任何日志处理程序,但仍然可以看到日志的输出,例如
log.warn
。如果Python为此完全默认为一个基本记录器,那就太好了。