![](https://secure.gravatar.com/avatar/e21553fc0dcfc7382d56ae4454285bb7.jpg?s=120&d=mm&r=g)
Hi Maciej, On 04.09.2015 00:08, Maciej Fijalkowski wrote:
On Thu, Sep 3, 2015 at 9:23 AM, Valentine Sinitsyn <valentine.sinitsyn@gmail.com> wrote:
Hi Armin,
On 25.08.2015 13:00, Armin Rigo wrote:
Hi Valentine,
On 25 August 2015 at 09:56, Valentine Sinitsyn <valentine.sinitsyn@gmail.com> wrote:
Yes, I think so. There is a *highly obscure* corner case: __del__ will still be called several times if you declare your class with "__slots__=()".
Even on "post-PEP-0442" Python 3.4+? Could you share a link please?
class X(object): __slots__=() # <= try with and without this def __del__(self): global revive revive = self print("hi")
X() revive = None revive = None revive = None
By accident, I found a solution to this puzzle:
class X(object): __slots__ = ()
class Y(object): pass
import gc gc.is_tracked(X()) # False gc.is_tracked(Y()) # True
An object with _empty_ slots is naturally untracked, as it can't create back references.
Valentine
_______________________________________________ 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/fijall%40gmail.com
That does not make it ok to have del called several time, does it? That's a tricky question. Python's data model [1,2] doesn't say anything about how many times __del__ can be called. PEP-0442 guarantees it will be called only once, but it implicitly covers GC-objects only.
For me, it looks like destructor behaviour for non-GC object is undefined, but I agree it makes sense to call them exactly once as well. 1. https://docs.python.org/3/reference/datamodel.html 2. https://docs.python.org/2/reference/datamodel.html -- Valentine