When an AttributeError is raised in a __del__ method, it is caught and ignored, except that it is not completely ignored but is replaced by a warning message sent to stderr. Example:
>>> class C():
        def __del__(self): raise AttributeError
        
>>> c=C()
>>> del c
Exception AttributeError: AttributeError() in <bound method C.__del__ of <__main__.C object at 0x000000000351A198>> ignored

The AttributeError is ignored, I presume, because one may be expected if __new__ runs but __init__ does not, because of an exception. AttributeErrors can also be expected during exit cleanup.

The message seems not to be a Warning. So it seems that is cannot be suppressed. The OP of http://bugs.python.org/issue12085 encountered this message with an unnecessary use of subprocesses.Popen. (There is better code that avoids the problem.) He considered the message a problem as it interfered with his output. He suggested the fix of changing 'self.attr' to "getattr(self. 'attr', False)".

Viktor Stinner applied this fix. I believe it should be reverted for three reasons:

1. It results in TypeError on exit when gettattr is set to None before __delete__ is called. http://bugs.python.org/issue19021. Even is that is fixed with an alternate patch (creating a 'backup' class attribute), I think it would still be wrong.

2. If we do not agree with the OP that putting output on stderr is bad, then no fix is needed and there should be none.

3. If we do agree that the unconditional output is a problem, then there should be a general fix. It is, in a sense, just happenstance that the OP encountered this with Popen. Some possibilities:

a. Decide the the message is not needed; just silently ignore the __del__ AttributeError. I am not sure what its intended use is.

b. Make the message a Warning that can be blocked, perhaps a RuntimeWarning. Does this warning message predate the warnings module, new in 2.1?

c. If the __del__ AttributeError occurs while processing the __init__ error, just chain it normally. But this would, I presume interfere with catching the __init__ exception.

d. Add a missing attribute in cleanup message to end of the __init__ exception message.

--
Terry Jan Reedy

_______________________________________________
Python-Dev mailing list
Python-Dev@python.org
https://mail.python.org/mailman/listinfo/python-dev
Unsubscribe: 
https://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com

Reply via email to