1 2import sys 3def _next(it): 4 if sys.version_info[0] >= 3: 5 return next(it) 6 else: 7 return it.next() 8 9def test_reference_cycle_cleanup(): 10 """ 11 >>> import gc 12 >>> delegator, gen, deleted = test_reference_cycle_cleanup() 13 14 >>> _next(delegator(gen())) 15 123 16 >>> _ = gc.collect(); print(sorted(deleted)) 17 ['bar', 'foo'] 18 """ 19 deleted = [] 20 class Destructed(object): 21 def __init__(self, name): 22 self.name = name 23 24 def __del__(self): 25 deleted.append(self.name) 26 27 def delegator(c): 28 d = Destructed('foo') 29 yield from c 30 31 def gen(): 32 d = Destructed('bar') 33 while True: 34 yield 123 35 36 return delegator, gen, deleted 37