Julien Palard added the comment: Problem looks mainly due to the __setattr__ done on a different type than the getattr, and the cache of PyType_Lookup:
- type_setattro will be called with Foo, "x", and the value to set - type_getattro will be called with FooProxy, "x" The timeline (with my weird_without_interactive.py) is: - type_setattro is called on Foo for attr "x" with the instance of Bar - type_getattro is called on FooProxy for attr "x" (the `proxy.x` line) During this type_getattro, the instance of Bar is cached in PyType_Lookup for (FooProxy, "x") - type_setattro is called on Foo for attr "x" with the value 0 During this call, insertdict will legitimately call DECREF on the Bar instance, which is deleted - type_getattro is called on FooProxy with attr "x" for the print() During this call, PyType_Lookup will cache hit for (FooProxy, x) with the old reference to the instance of Bar ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue28866> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com