import unittest import gc import time import weakref class ReferentDummy: def __init__(self, name): self.name = name def __str__(self): return self.name class ResurrectionDummy: def __del__(self): ResurrectionDummy.resurrected = self.toResurrect class GCDetector(): gcIndex = 0 def __del__(self): GCDetector.gcIndex += 1 maxGCRun = 10 def runGC(): currentIndex = GCDetector.gcIndex gcCount = 0 detector = GCDetector() detector = None while currentIndex == GCDetector.gcIndex and gcCount < maxGCRun: gc.collect() gcCount += 1 time.sleep(0.1) class GCTests(unittest.TestCase): def test_id_after_resurrection(self): l = ["ab"] rd = ResurrectionDummy() rd.toResurrect = l savedId = id(l) l = None rd = None runGC() self.assertEqual(id(ResurrectionDummy.resurrected), savedId) def test_weakref_after_resurrection(self): l = ReferentDummy("ab") rd = ResurrectionDummy() rd.toResurrect = l wref = weakref.ref(l) self.assertIn(wref, weakref.getweakrefs(l)) l = None rd = None runGC() self.assertIn(wref, weakref.getweakrefs(ResurrectionDummy.resurrected)) def test_main(): unittest.main() if __name__ == "__main__": test_main()