Я работаю над script, который занимает несколько минут для запуска, и хотел бы предоставить пользователю некоторый результат о его прогрессе. К сожалению, я очень ленив. то, что я хотел бы сделать, это написать функцию без ведения журнала, а затем применить к ней декоратор, который выполняет функцию и печатает каждую строку перед выполнением этой строки. В основном я ищу 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
, если только соответствующая функция не оформлена.