""" | |
gc.get_referrers() can be used to see objects before they are fully built. | |
Note that this is only an example. There are many ways to crash Python | |
by using gc.get_referrers(), as well as many extension modules (even | |
when they are using perfectly documented patterns to build objects). | |
Identifying and removing all places that expose to the GC a | |
partially-built object is a long-term project. A patch was proposed on | |
SF specifically for this example but I consider fixing just this single | |
example a bit pointless (#1517042). | |
A fix would include a whole-scale code review, possibly with an API | |
change to decouple object creation and GC registration, and according | |
fixes to the documentation for extension module writers. It's unlikely | |
to happen, though. So this is currently classified as | |
"gc.get_referrers() is dangerous, use only for debugging". | |
""" | |
import gc | |
def g(): | |
marker = object() | |
yield marker | |
# now the marker is in the tuple being constructed | |
[tup] = [x for x in gc.get_referrers(marker) if type(x) is tuple] | |
print tup | |
print tup[1] | |
tuple(g()) |