Cyclic references et C libraries

Martin v. Löwis martin at v.loewis.de
Sat Aug 30 21:28:04 EDT 2003


Fabien SK <fabsk+news at free.fr> writes:

> One solution would be to wrap the parent objet in a new class
> (forwarding all the calls to the parent object). In the "__del__"
> method of this class, I would clean the list of children object, and
> then remove the reference on the parent objet so its "__del__" method
> will be called. Am I right ?

I would not wrap the parent object, but the file handle. So do

class Handle:
  def __init__(self, *args):
    self.h = lib_open(*args)
  def read_section(self, *args):
    return lib_read_section(self.h, *args)
  def __del__(self):
    lib_close(self.h)

class Parent:
  def __init__(self, ...):
    # change 
    # self.handle = lib_open(...)
    # to
    self.Handle(...)

Then, the Handle class won't participate in a cycle, and it can safely
have an __del__.

> Last question: why does the python file objects not have a "__del__"
> method ? How the file can be closed when the last reference is remove
> ?

If a Python type is implemented in C, it does not need to have an
__del__. Instead, having a tp_del slot in its PyTypeObject C structure
is sufficient.

Regards,
Martin




More information about the Python-list mailing list