这样的事情怎么样?这对您有用吗?
调试上下文:
import sysclass debug_context(): """ Debug context to trace any function calls inside the context """ def __init__(self, name): self.name = name def __enter__(self): print('Entering Debug Decorated func') # Set the trace function to the trace_calls function # So all events are now traced sys.settrace(self.trace_calls) def __exit__(self, *args, **kwargs): # Stop tracing all events sys.settrace = None def trace_calls(self, frame, event, arg): # We want to only trace our call to the decorated function if event != 'call': return elif frame.f_pre.co_name != self.name: return # return the trace function to use when you go into that # function call return self.trace_lines def trace_lines(self, frame, event, arg): # If you want to print local variables each line # keep the check for the event 'line' # If you want to print local variables only on return # check only for the 'return' event if event not in ['line', 'return']: return co = frame.f_pre func_name = co.co_name line_no = frame.f_lineno filename = co.co_filename local_vars = frame.f_locals print (' {0} {1} {2} locals: {3}'.format(func_name, event, line_no, local_vars))调试装饰器:
def debug_decorator(func): """ Debug decorator to call the function within the debug context """ def decorated_func(*args, **kwargs): with debug_context(func.__name__): return_value = func(*args, **kwargs) return return_value return decorated_func
用法
@debug_decoratordef testing() : a = 10 b = 20 c = a + btesting()
输出量
############################################################output:# Entering Debug Decorated func# testing line 44 locals: {}# testing line 45 locals: {'a': 10}# testing line 46 locals: {'a': 10, 'b': 20}# testing return 46 locals: {'a': 10, 'b': 20, 'c': 30}###########################################################


