我正在编写一个需要几分钟才能运行的脚本,并希望向用户提供一些关于其进度的输出。不幸的是,我非常懒惰。我想做的是编写一个没有日志记录的函数,然后对其应用一个装饰器,该装饰器逐步执行该函数并在执行该行之前打印每一行。基本上我正在寻找的是loggingdecorator
这样的:
>>> @loggingdecorator
... def myfunction():
... foo()
... bar()
... baz()
>>> myfunction()
Starting myfunction
foo() ... [OK]
bar() ... [OK]
baz() ... [OK]
myfunction Done!
这是我到目前为止所尝试的:
import sys
def logging_tracer(frame, event, arg):
def local_tracer(local_frame, event, arg):
if frame is local_frame:
print frame.f_code.co_name, event, arg
print frame.f_code.co_name, event, arg
return local_tracer
def loggingdecorator(func):
def _wrapper():
old_trace_function = sys.gettrace()
sys.settrace(logging_tracer)
try:
result = func()
except:
raise
else:
return result
finally:
sys.settrace(old_trace_function)
return _wrapper
不幸的是,这打印得太多了。它遵循函数调用并将它们逐行打印出来(嗯,这实际上并没有打印源代码行,使用检查的现有答案,结合跟踪函数中框架对象上的东西会做到这一点),但我对于logging_tracer
除非有问题的功能实际上是如何装饰的,我有点难过。