Skip to content

Instantly share code, notes, and snippets.

@mahirchavda
Last active May 24, 2020 11:33
Show Gist options
  • Save mahirchavda/b5af2caf70c28a3833ff2c7a33681237 to your computer and use it in GitHub Desktop.
Save mahirchavda/b5af2caf70c28a3833ff2c7a33681237 to your computer and use it in GitHub Desktop.
Trace python function calls, arguments and return values
from functools import wraps
indent = 0
def trace(func):
@wraps(func)
def function_wrapper(*args, **kwargs):
"""function_wrapper of trace"""
global indent
print("{indent} HI {func_name}, args={args}, kargs={kwargs}".format(indent="\t"*indent, func_name=func.__name__, args=args, kwargs=kwargs))
indent += 1
res = func(*args, **kwargs)
indent -= 1
print("{indent} Bye {func_name}, return={ret_val}".format(indent="\t"*indent, func_name=func.__name__, ret_val=res))
return res
return function_wrapper
if __name__ == "__main__":
# Demo
@trace
def a(*args, **kwargs):
return "a_out"
@trace
def b(*args, **kwargs):
c("c1", "c2")
return "b_out"
@trace
def c(*args, **kwargs):
return "c_out"
@trace
def d(*args, **kwargs):
return "d_out"
@trace
def main():
a("a1", "a2")
b("b1", "b2")
d("d1", "d2")
main()
# Output: python trace.py
"""
HI main, args=(), kargs={}
HI a, args=('a1', 'a2'), kargs={}
Bye a, return=a_out
HI b, args=('b1', 'b2'), kargs={}
HI c, args=('c1', 'c2'), kargs={}
Bye c, return=c_out
Bye b, return=b_out
HI d, args=('d1', 'd2'), kargs={}
Bye d, return=d_out
Bye main, return=None
"""
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment