gpt4 book ai didi

python - 在 Python 中有条件地评估调试语句

转载 作者:太空狗 更新时间:2023-10-29 17:48:44 25 4
gpt4 key购买 nike

Python 有几种打印“trace”输出的方法。 printimport loggingstdout.write 都可以用来打印调试信息,但它们都有一个缺点:即使logger的阈值是太高或流已关闭,Python 仍将评估 print 语句的参数。 (严格评估)这可能会花费字符串格式或更多。

明显的解决方法是将字符串创建代码放入 lambda 中,并使用我们自己的日志记录函数有条件地调用 lambda(这个检查 __debug__ 内置变量,它被设置为 False每当 python 以 -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 语句相同的条件求值属性?或者,除了这里介绍的方法之外,还有其他方法吗?

最佳答案

如果您所有的调试函数都将接受一个字符串,为什么不将其更改为接受一个格式字符串和参数:

debug(lambda:"Working on {0}".format(currentItem))

成为

debug("Working on {0}", currentItem)

if __debug__:
def debug(format, *values):
print format.format(*values)
else:
def debug(format, *values): pass

这具有第一个选项的所有优点,不需要 lambda,如果 if __debug__: 被移出 of 函数,那么它只在加载包含模块时被测试一次语句的开销只是一个函数调用。

关于python - 在 Python 中有条件地评估调试语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7634457/

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