Destruction of generator objects

Kay Schluehr kay.schluehr at gmx.net
Sat Aug 11 08:20:23 EDT 2007


On Aug 11, 2:00 pm, Stefan Bellon <sbel... at sbellon.de> wrote:
> On Sat, 11 Aug, Kay Schluehr wrote:
> > Honestly, I'd recommend wrapping the generator into a function object,
> > create the resource on construction ( or pass it ) and destroy it
> > implementing __del__.
>
> > def gen_value(self):
> >     while True:
> >         yield self.iter.next()
>
> > class GeneratorObj(object):
> >     def __init__(self, obj, gen):
> >         self.iter = make_iter(obj)
> >         self.gen  = gen(self)
>
> >     def __del__(self):
> >         destroy(self.iter)
>
> >     def next(self):
> >         return self.gen.next()
>
> Ok, I think there is an __iter__ missing in order to implement the
> iterator protocol, and I don't see why the generator cannot be inside
> the class itself.

Sure.

[...]

> But I do not see an output of "gen del" which makes me think that the
> destructor is not called, thus not releasing the resource. It seems I
> have not completely understood how generators work ...

But why shall the destructor be called? Your example does not indicate
that a ListGenerator object is somewhere destroyed neither explicitely
using del nor implicitely by destroying the scope it is living in.




More information about the Python-list mailing list