Pracuję nad skryptem, który potrwa kilka minut i chciałbym przekazać użytkownikowi pewne informacje o jego postępach. Niestety jestem wyjątkowo leniwy. chciałbym napisać funkcję bez rejestrowania, a następnie zastosować dekorator, który przechodzi przez funkcję i drukuje każdą linię przed wykonaniem tej linii. Zasadniczo co szukam jest loggingdecorator
takie, że:Dekorator do zapisania linii wykonywania funkcji po linii
>>> @loggingdecorator
... def myfunction():
... foo()
... bar()
... baz()
>>> myfunction()
Starting myfunction
foo() ... [OK]
bar() ... [OK]
baz() ... [OK]
myfunction Done!
Oto, co starałem dotąd:
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
Niestety, ten wypisuje trochę za dużo; następuje po wywołaniach funkcji i wypisuje je, linia po linii, jak również (cóż, to właściwie nie drukuje linii źródłowej, istniejące odpowiedzi za pomocą inspekcji, w połączeniu z rzeczami na obiekcie ramki w funkcji śledzenia to robią), ale ja "Jestem nieco zaskoczony, jak logging_tracer
, chyba że dana funkcja jest faktycznie dekorowana.
Możesz umieścić ten sam dekorator na wszystkich funkcjach, do których chcesz zadzwonić. Następnie umieść instrukcję drukowania wewnątrz funkcji. W miarę wykonywania funkcji wykonywane są również instrukcje drukowania. Możesz też po prostu umieścić instrukcję drukowania w każdej funkcji bez obawy o dekorator i powinna ona nadal robić to samo: – smac89
@ Smac89 Twoja sugestia jest zbyt inwazyjna. Wydruk debugowania jest bardzo złą techniką śledzenia – J0HN
Najbliższa rzecz, o której myślę, to line_profiler. Prawdopodobnie możesz użyć podobnej metody, aby zrobić to, co chcesz. Niestety, line_profiler jest napisany w c/cython, więc nie jest to łatwe do modyfikacji. –