小编cod*_*ior的帖子

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

Python有几种打印"跟踪"输出的方法.print,import logging,stdout.write可用于打印调试信息,但他们都有一个缺点:即使记录仪的门槛太高或流被关闭,Python将仍然评估参数的print语句.(严格评估)这可能会花费字符串格式或更多.

显而易见的解决方法是将字符串创建代码放入lambda中,并使用我们自己的日志记录函数有条件地调用lambda(这个检查__debug__内置变量,每当python启动-O优化时设置为False ):

def debug(f):
  if __debug__:
    print f()
    #stdout.write(f())
    #logging.debug(f())

for currentItem in allItems:
  debug(lambda:"Working on {0}".format(currentItem))
Run Code Online (Sandbox Code Playgroud)

优点是不调用str(currentItem)string.format发布版本,缺点是必须lambda:在每个日志记录语句中键入.

Python的assert语句由Python编译器专门处理.如果运行python -O,则丢弃任何断言语句而不进行任何评估.您可以利用它来制作另一个有条件评估的日志记录语句:

assert(logging.debug("Working on {0}".format(currentItem)) or True)
Run Code Online (Sandbox Code Playgroud)

启动Python时,不会评估此行-O.

短路运营商'和'和'或'甚至可以使用:

__debug__ and logging.debug("Working on {0}".format(currentItem));
Run Code Online (Sandbox Code Playgroud)

但是现在我们最多有28个字符加上输出字符串的代码.

我要问的问题:是否有任何标准的python语句或函数具有与语句相同的条件评估属性assert?或者,有没有人有这里提出的方法的任何替代方案?

python debugging logging

12
推荐指数
1
解决办法
3237
查看次数

标签 统计

debugging ×1

logging ×1

python ×1