On Sun, 7 Mar 2010 17:20:07 +0100 Hugo Arts <hugo.yo...@gmail.com> wrote:
> On Sun, Mar 7, 2010 at 1:58 PM, spir <denis.s...@gmail.com> wrote: > > Hello, > > > > Is it possible at all to have a recursive generator? I think at a iterator > > for a recursive data structure (here, a trie). The following code does not > > work: it only yields a single value. Like if child.__iter__() were never > > called. > > > > def __iter__(self): > > ''' Iteration on (key,value) pairs. ''' > > print '*', > > if self.holdsEntry: > > yield (self.key,self.value) > > for child in self.children: > > print "<", > > child.__iter__() > > print ">", > > raise StopIteration > > > > With the debug prints in code above, "for e in t: print e" outputs: > > > > * ('', 0) > > < > < > < > < > < > < > < > < > > > > > print len(t.children) # --> 9 > > > > Why is no child.__iter__() executed at all? I imagine this can be caused by > > the special feature of a generator recording current execution point. (But > > then, is it at all possible to have a call in a generator? Or does the > > issue only appear whan the callee is a generator itself?) Else, the must be > > an obvious error in my code. > > > > > > Denis > > remember that child.__iter__ returns a generator object. Merely > calling the function won't do anything. To actually get elements from > a generator object, you need to call next() on the returned iterator, > or iterate over it in another way (e.g. a for loop). I would write > this method more or less like so: > > from itertools import chain > > def __iter__(self): > this_entry = [(self.key, self.value)] is self.holds_entry else [] > return chain(this_entry, *[iter(c) for c in self.children]) > > (Warning! untested! I'm pretty sure chain will work like this, but you > might have to do a little tweaking) @ Hugo & Steven Thank you very much. I'll study your proposals as soon as I can, then tell you about the results. In the meanwhile, I (recursively) constructed the collection of entries and returned iter(collection). [This works, indeed, but I also want do know how to properly build a recursive iterator.] Denis -- ________________________________ la vita e estrany spir.wikidot.com _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: http://mail.python.org/mailman/listinfo/tutor