anv*_*erx 5 python optimization logging arguments
假设我有这样的声明
logging.debug('%r', do_really_expensive_computation())
or
logging.debug('%r', find_my_object().do_really_expensive_computation())
Run Code Online (Sandbox Code Playgroud)
当日志记录级别设置为以上时,DEBUG它不会记录日志,但它仍然会在调用之前评估参数logging.debug(),并且执行do_really_expensive_computation()也find_my_object()可能相当繁重。
当低于当前级别时,是否有任何好的模式可以跳过日志记录中涉及的所有计算?
一种方法是创建一个帮助器类,其中的__repr__方法返回给定回调函数的值,并将使用昂贵的函数对象初始化的帮助器类的实例传递给记录器以进行惰性求值:
class r:
def __init__(self, callback):
self.callback = callback
def __repr__(self):
return repr(self.callback())
Run Code Online (Sandbox Code Playgroud)
以便:
import logging
def expensive():
print('this is expensive')
return 1
print('debug:')
logging.debug('%r', r(expensive))
print('error:')
logging.error('%r', r(expensive))
Run Code Online (Sandbox Code Playgroud)
输出:
debug:
error:
this is expensive
ERROR:root:1
Run Code Online (Sandbox Code Playgroud)