Destruction of generator objects

Stefan Bellon sbellon at sbellon.de
Tue Aug 7 18:28:52 EDT 2007


Hi all,

I'm generating a binding from Python to C using SWIG. On the C side I
have iterators over some data structures. On the Python side I
currently use code like the following:

    def get_data(obj):
        result = []
        iter = make_iter(obj)
        while more(iter):
            item = next(iter)
            result.append(item)
        destroy(iter)
        return result

Now I'd like to transform it to a generator function like the following
in order to make it more memory and time efficient:

    def get_data(obj):
        iter = make_iter(obj)
        while more(iter):
            yield next(iter)
        destroy(iter)

But in the generator case, I have a problem if the generator object is
not iterated till the StopIteration occurs, but if iteration is stopped
earlier. In that case, the C iterator's destroy is not called, thus the
resource is not freed.

Is there a way around this? Can I add some sort of __del__() to the
generator object so that in case of an early destruction of the
generator object, the external resource is freed as well?

I'm looking forward to hearing your hints!

-- 
Stefan Bellon



More information about the Python-list mailing list