【发布时间】:2011-11-29 20:55:39
【问题描述】:
Python 有几种打印“跟踪”输出的方法。 print, import logging, stdout.write 可用于打印调试信息,但它们都有一个缺点:即使记录器的阈值过高或流已关闭,Python 仍会评估打印语句的参数. (严格评估)这可能会花费字符串格式或更多。
明显的解决方法是将创建字符串的代码放入 lambda,并使用我们自己的日志记录函数有条件地调用 lambda(这个检查 __debug__ 内置变量,每当 python 启动时,该变量设置为 False -O 用于优化):
def debug(f):
if __debug__:
print f()
#stdout.write(f())
#logging.debug(f())
for currentItem in allItems:
debug(lambda:"Working on {0}".format(currentItem))
优点是在发布版本中不调用str(currentItem) 和string.format,缺点是必须在每个日志记录语句中输入lambda:。
Python 的assert 语句由Python 编译器特殊处理。如果 python 使用-O 运行,则任何断言语句都将被丢弃而不进行任何评估。您可以利用它来创建另一个条件评估的日志记录语句:
assert(logging.debug("Working on {0}".format(currentItem)) or True)
当 Python 以 -O 启动时,不会计算此行。
甚至可以使用短路运算符“and”和“or”:
__debug__ and logging.debug("Working on {0}".format(currentItem));
但现在我们最多有 28 个字符加上输出字符串的代码。
我要回答的问题是:是否有任何标准的 Python 语句或函数具有与 assert 语句相同的条件评估属性?或者,有没有人可以替代这里介绍的方法?
【问题讨论】:
-
感谢您的回答,但看起来
logging模块在字符串格式化方面已经解决了这个问题。当 print 语句的主体不只是%或string.format时,我正在寻找一个更一般的情况。例如,", ".join([x.foo for x in exes if x in whys]) -
+1 表示“短路”的想法!是的,标准字符串格式已解决,但有时您需要运行昂贵的自定义代码以生成调试输出。