Python日志的Cstyle vs Pythonstyle字符串格式

2024-06-14 06:46:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我是Django的新手,一直在玩伐木。在我看来,以下info()语句基本上是等价的:

log = logging.getLogger(__name__)
.
.
.
    log.info("This is a %s" % "test")  # Python style
    log.info("This is a %s", "test")   # C style

有什么区别吗?就我个人而言,我一直喜欢在任何地方使用Python风格的格式,我倾向于坚持这种方法。Python格式还有很多内容,所以它看起来更强大。为什么Django给我们选择?使用C风格有什么好处吗?在


Tags: djangotestinfologisstyle风格logging
2条回答

这实际上不是关于字符串格式,而是关于向方法传递参数。在

方法logging.info,作为其相关方法logging.debuglogging.warninglogging.error等,采用以下参数:

logging.info(msg, *args, **kwargs)

这意味着msg是一个必需的位置参数。在第一个示例中,只传递一个参数:

^{pr2}$

在另一个例子中,您传递了两个参数:

"This is a %s" # msg
"test" # *args

在第一个示例中,您手动执行该方法可以为您完成的工作。在

多参数样式延迟格式化时刻。这使日志模块的其他部分有机会在最终格式化之前对这些参数进行操作,甚至选择忽略调用。在

正如Charles Duffypoints outlogging flow diagram中的第一步是检查是否为调用级别启用了记录器。如果没有启用日志记录级别,甚至不会创建LogRecord。因此,在这些情况下,延迟格式化可以节省程序的计算周期。在


此延迟的另一个可能用途是^{}s可以在参数格式化之前处理它们:

import logging

class ContextFilter(logging.Filter):
    def filter(self, record):
        for key in record.args:
            record.args[key] = ' '.join(record.args[key].upper())
        return True

logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
filt = ContextFilter()
logger.addFilter(filt)

logger.info("'Twas %(adj)s, and the slithy %(noun)s", {'adj': 'brillig', 'noun': 'toves'})

日志

^{pr2}$

请注意,参数brilligtoves被大写并用ContextFilter隔开。如果logger.info仅仅接受预格式化的字符串,那么您将无法做到这一点(不强制用户在调用logger.info之前完成ContextFilter的工作)。在


过滤器也可以用来(惊喜!)在记录发出之前过滤掉它们(通过返回False而不是True)。延迟格式化允许Filters根据参数值检查并可能筛选出记录。因此,在不需要时,可以完全避免使用字符串格式。在

相关问题 更多 >