| """ |
| 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()) |