1# test sys.settrace with generators 2 3import sys 4 5try: 6 sys.settrace 7except AttributeError: 8 print("SKIP") 9 raise SystemExit 10 11 12def print_stacktrace(frame, level=0): 13 print( 14 "%2d: %s@%s:%s => %s:%d" 15 % ( 16 level, 17 " ", 18 frame.f_globals["__name__"], 19 frame.f_code.co_name, 20 # Keep just the filename. 21 "sys_settrace_" + frame.f_code.co_filename.split("sys_settrace_")[-1], 22 frame.f_lineno, 23 ) 24 ) 25 26 if frame.f_back: 27 print_stacktrace(frame.f_back, level + 1) 28 29 30trace_count = 0 31 32 33def trace_tick_handler(frame, event, arg): 34 global trace_count 35 print("### trace_handler::main event:", event) 36 trace_count += 1 37 print_stacktrace(frame) 38 return trace_tick_handler 39 40 41def test_generator(): 42 def make_gen(): 43 yield 1 << 0 44 yield 1 << 1 45 yield 1 << 2 46 return 1 << 3 47 48 gen = make_gen() 49 r = 0 50 try: 51 52 r += gen.send(None) 53 54 while True: 55 56 r += gen.send(None) 57 58 except StopIteration as e: 59 print("test_generator", r, e) 60 61 gen = make_gen() 62 r = 0 63 for i in gen: 64 r += i 65 print(r) 66 67 68sys.settrace(trace_tick_handler) 69test_generator() 70sys.settrace(None) 71print("Total traces executed: ", trace_count) 72