cod*_*ior 12 python debugging logging
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
?或者,有没有人有这里提出的方法的任何替代方案?
logging.debug
我想知道当没有处理程序时,调用对性能有多大影响。
然而if __debug__:
,即使在函数体内,该语句也仅被评估一次
$ python -O
Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import dis
>>> import logging
>>> def debug(*a, **kw):
... if __debug__:
... logging.debug(*a, **kw)
...
>>> dis.dis(debug)
2 0 LOAD_CONST 0 (None)
3 RETURN_VALUE
>>>
Run Code Online (Sandbox Code Playgroud)
并且记录器可以使用字符串格式化运算符为您格式化消息。这里是一个稍微修改过的例子,取自logging.debug文档
FORMAT = '%(asctime)-15s %(clientip)s %(user)-8s %(message)s'
logging.basicConfig(format=FORMAT)
d = { 'clientip' : '192.168.0.1', 'user' : 'fbloggs' }
debug('Protocol problem: %s', 'connection reset', extra=d)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果关闭优化,则永远不会评估消息字符串。
归档时间: |
|
查看次数: |
3237 次 |
最近记录: |