No, since Python 2.0 cyclic references are collectable and will be garbage 
collected eventually. However, the __del__ method of the cyclic trash will 
not be executed as there is no way to do so consistently while all objects 
in the cycle are alive.

In Cython, the  __dealloc__ method will be called, but with (partially) 
dead objects: Some of the objects in the reference cycle may have their 
Python attributes already cleared.

In Python 3.4 (PEP 442) the __del__ method is called on all objects of the 
cycle first (in a random order), and then the objects are garbage collected.

One quirk is that objects are resurrected if __del__ generates a new 
reference to the object, though I don't know if that applies here.


On Saturday, January 31, 2015 at 9:35:12 PM UTC-5, Nils Bruin wrote:
>
> On Saturday, January 31, 2015 at 5:06:54 PM UTC-8, Volker Braun wrote:
>>
>> On Saturday, January 31, 2015 at 3:59:05 PM UTC-5, Jeroen Demeyer wrote:
>>>
>>> In any case: after removing __del__ from Expect and Interface, all 
>>> doctests pass, so it's not that bad. 
>>>
>>
>> Also __del__ is never going to be reliably called in the face of cyclic 
>> references,
>>
>
> That is not true: In Python2, cycles with objects with __del__ methods in 
> them are not automatically deleted, so the methods are reliably *not* 
> called, because the objects aren't destructed. In Python3, it is guaranteed 
> that a __del__ method on an object is called at least once. If you do evil 
> stuff such as making the object reachable again in the __del__, then python 
> will prevent the cycle from being destructed, but now you're on your own 
> concerning the state in which your objects are (and it could happen that 
> the __del__ gets called again).
>
> so I'm all for taking it out. Cleanup should be done elsewhere (or do it 
>> in Cython __deallocate__
>>
>
> That will require careful design. By the time a __dealloc__ is executed, 
> the object is already torn down considerably, so just calling a method 
> ".quit()" on the object is not a good idea. I think Jeroen's suggestion of 
> somehow subclassing so that the object returned by Expect.spawn can do 
> proper tear-down (that probably means registering with it the strings that 
> should be sent to the interface to precipitate a tear-down) is a good idea. 
> These objects will be fairly limited, so guaranteeing they are not in 
> cycles won't be too bad. Then having a __del__ method to do the clean-up 
> there should be acceptable.
>
> Another workaround would be to put all the cleanup in a call-back of a 
> weakref, and store the weakref in a global dictionary somewhere. The 
> callback should of course not hold any strong references, but it will be 
> able to get a pointer to the original object via the weakref that is 
> available to the callback. Upon exit from the system there is of course no 
> guarantee that the weakref callback will get executed, because it might get 
> deleted before the interface.
>

-- 
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sage-devel+unsubscr...@googlegroups.com.
To post to this group, send email to sage-devel@googlegroups.com.
Visit this group at http://groups.google.com/group/sage-devel.
For more options, visit https://groups.google.com/d/optout.

Reply via email to