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