gpt4 book ai didi

python - 为什么 python 日志记录包不支持打印可变长度参数?

转载 作者:行者123 更新时间:2023-11-28 20:00:14 25 4
gpt4 key购买 nike

刚学Python的时候,我习惯这样做:

  print "text", lineNumber, "some dictionary", my_dict

当我编写自己的日志记录工具时,我自然希望能够将任意大小的项目列表传递给它,所以我这样做了:

def error(*args):
print ERR_PREFIX,
for _x in args:
print _x,
print "\r\n",

error("text", lineNumber, "some dictionary", my_dict)

现在我想开始使用 logging 包,因为它有更多好东西,我不想复制他们的努力。总的来说,它看起来像一个可以做很多事情的简洁设计。但令我感到困扰的是,您不能再向它展示相同的项目列表以供其打印。相反,我必须将所有调用更改为更像这样的内容:

error("text %d some dictionary %s" % (lineNumber, my_dict))

或者,我可以像这样做一些非常愚蠢的事情:

error(' '.join(map, str(("text", lineNumber, "some dictionary", my_dict))))

问题是,为什么要省略这么明显的用例呢?如果您想从典型的“打印”语句直接转到新奇的日志记录工具,这不是更容易吗?

作为后续问题,您能想出一种方法来覆盖 Logger 类来执行此操作吗?

最佳答案

我建议最好将现有的日志消息更新为日志模块期望的样式,因为其他人查看您的代码会更容易,因为日志模块将不再像他们期望的那样运行。

顺便提一下,下面的代码将使日志记录模块按照您的期望运行。

import logging
import types

class ExtendedLogRecord(logging.LogRecord):

def getMessage(self):
"""
Return the message for this LogRecord.

Return the message for this LogRecord after merging any user-supplied
arguments with the message.
"""
if not hasattr(types, "UnicodeType"): #if no unicode support...
msg = str(self.msg)
else:
try:
msg = str(self.msg)
except UnicodeError:
msg = self.msg #Defer encoding till later
if self.args:
msg +=' '+' '.join(map(str,self.args))
return msg

#Patch the logging default logging class
logging.RootLogger.makeRecord=lambda self,*args: ExtendedLogRecord(*args)

some_dict={'foo':14,'bar':15}
logging.error('text',15,'some dictionary',some_dict)

输出:

ERROR:root:text 15 some dictionary {'foo': 14, 'bar': 15}

关于python - 为什么 python 日志记录包不支持打印可变长度参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/812422/

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