On Sun, Sep 4, 2016 at 10:37 PM, Ben Finney <ben+pyt...@benfinney.id.au> wrote: >> And an example: >> >> >> py> e = Eggs() >> instance created successfully >> self definitely exists: <__main__.Eggs object at 0xb7bf21ec> >> Traceback (most recent call last): >> File "<stdin>", line 1, in <module> >> File "<stdin>", line 8, in __init__ >> Exception >> py> > > > Right. The instance is constructed successfully (by ā__new__ā, the > constructor). It will be bound to āsā, creating a reference to the > instance. > > The exception raised from the initialiser does not stop you from binding > the instance to a name. That binding succeeds; the reference remains. > Nothing has caused that reference to go away.
Presumably you mean "bound to 'e'" here. But it isn't; the expression Eggs() raised an exception, so nothing got assigned anywhere. It doesn't depend on __new__ either: >>> class Eggs: ... def __init__(self): ... print("init:", self) ... raise Exception ... def __del__(self): ... print("del:", self) ... >>> e=Eggs() init: <__main__.Eggs object at 0x7ffa8fc97400> Traceback (most recent call last): File "<stdin>", line 1, in <module> File "<stdin>", line 4, in __init__ Exception >>> e del: <__main__.Eggs object at 0x7ffa8fc97400> Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'e' is not defined There's a reference here somewhere, though. My suspicion is it's in sys.exc_info / sys.last_traceback, which is why triggering another exception causes the object to be cleaned up. ChrisA -- https://mail.python.org/mailman/listinfo/python-list