Hi Maciej,

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