import sys
def profiler(frame, event, arg):
if event == 'call':
print(f"[ENTER] Context: {frame.f_code.co_name}")
elif event == 'return':
print(f"[EXIT] Context: {frame.f_code.co_name}")
def print_call_stack_decorator(func):
def wrapper(*args, **kwargs):
orig_profile = sys.getprofile()
sys.setprofile(profiler)
value = func(*args, **kwargs)
sys.setprofile(orig_profile)
return value
return wrapper
def c():
print("c")
def b():
c()
print('b')
@print_call_stack_decorator
def a():
b()
print('a')
a()
aW1wb3J0IHN5cwoKZGVmIHByb2ZpbGVyKGZyYW1lLCBldmVudCwgYXJnKToKICAgIGlmIGV2ZW50ID09ICdjYWxsJzoKICAgICAgICBwcmludChmIltFTlRFUl0gQ29udGV4dDoge2ZyYW1lLmZfY29kZS5jb19uYW1lfSIpCiAgICBlbGlmIGV2ZW50ID09ICdyZXR1cm4nOgogICAgICAgIHByaW50KGYiW0VYSVRdIENvbnRleHQ6IHtmcmFtZS5mX2NvZGUuY29fbmFtZX0iKQoKZGVmIHByaW50X2NhbGxfc3RhY2tfZGVjb3JhdG9yKGZ1bmMpOgogICAgZGVmIHdyYXBwZXIoKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICBvcmlnX3Byb2ZpbGUgPSBzeXMuZ2V0cHJvZmlsZSgpCiAgICAgICAgc3lzLnNldHByb2ZpbGUocHJvZmlsZXIpCiAgICAgICAgdmFsdWUgPSBmdW5jKCphcmdzLCAqKmt3YXJncykKICAgICAgICBzeXMuc2V0cHJvZmlsZShvcmlnX3Byb2ZpbGUpCiAgICAgICAgcmV0dXJuIHZhbHVlCiAgICByZXR1cm4gd3JhcHBlcgoKZGVmIGMoKToKICAgIHByaW50KCJjIikKCmRlZiBiKCk6CiAgICBjKCkKICAgIHByaW50KCdiJykKCkBwcmludF9jYWxsX3N0YWNrX2RlY29yYXRvcgpkZWYgYSgpOgogICAgYigpCiAgICBwcmludCgnYScpCgphKCk=