[Python-Dev] tp_finalize vs tp_del sematics

Valentine Sinitsyn valentine.sinitsyn at gmail.com
Thu Sep 3 21:15:34 CEST 2015


Hi Maciej,

On 04.09.2015 00:08, Maciej Fijalkowski wrote:
> On Thu, Sep 3, 2015 at 9:23 AM, Valentine Sinitsyn
> <valentine.sinitsyn at 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 at 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 at 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


More information about the Python-Dev mailing list