Skip to content

Instantly share code, notes, and snippets.

@andreycizov
Created December 1, 2020 11:24
Show Gist options
  • Save andreycizov/ed3b464ec3c7bdbf9f5c98a972ee865b to your computer and use it in GitHub Desktop.
Save andreycizov/ed3b464ec3c7bdbf9f5c98a972ee865b to your computer and use it in GitHub Desktop.
Python log the lines which returned the value in a callable
def trace_return(pretty_printer):
def decorator(fun):
def decorated(*args, **kwargs):
import sys
import inspect
last_line = None
entered = False
def tracer(frame, event, arg=None):
nonlocal last_line
nonlocal entered
if event == 'call':
if not entered:
entered = True
return tracer
else:
return None
elif event == 'line':
frame_info = inspect.getframeinfo(frame)
last_line = (frame_info.filename, frame_info.lineno)
return tracer
elif event == 'return':
return
elif event == 'exception':
return tracer
else:
raise NotImplementedError(repr(event))
old_tracer = sys.gettrace()
sys.settrace(tracer)
rtn = fun(*args, **kwargs)
sys.settrace(old_tracer)
import pprint
pprint.pprint([
fun.__name__,
pretty_printer(args, kwargs, rtn),
last_line
])
return rtn
return decorated
return decorator
@trace_return(lambda @trace_return(lambda args, kwargs, rtn: [kwargs['date'], rtn])
def fun(date):
return date
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment