Augmented generators?

Bengt Richter bokr at oz.net
Tue Jan 10 15:54:44 EST 2006


On Tue, 10 Jan 2006 18:37:13 GMT, "Andrew Koenig" <ark at acm.org> wrote:

>Can anyone think of an easy technique for creating an object that acts like 
>a generator but has additional methods?
>
>For example, it might be nice to be able to iterate through an associative 
>container without having to index it for each element.  Right now, I can say
>
>    i = iter(d)
>
>and then repeatedly calling i.next() gives us the keys for the elements. 
>But to get the corresponding value requires us to look up the key.
>
>Of course one could define a generator that yields key-value pairs, along 
>the following lines:
>
>    def kviter(d):
>        for i in d:
>            yield i, d[i]
>
>to hide the lookup.  But this yields a tuple even when you don't want it. 
>In other words, I must now write
>
>    for k, v in kviter(d):
>        # whatever
>
>and I can think of situations in which I don't really want both the key and 
>the value all the time.
>
>So what I really want is something like this:
>
>    it = augiter(d)
>    for i in it:
>        if <some condition on i>:
>            foo(it.value())
>
>In other words, I want "it" to support both the next and value methods (or 
>next and something else)
>
>Of course I can write such a beast as a class, but that prevents me from 
>taking advantage of the yield statement in its implementation.
>
It does? (this just occurred to me, so there may be some gotcha ;-)

 >>> class augiter(object):
 ...     def __init__(self, d): self.d = d
 ...     def __iter__(self):
 ...         for k in self.d: self.value = self.d[k]; yield k
 ...
 >>> it = augiter(dict(enumerate('abcd')))
 >>> for i in it:
 ...     if i%2: print i, it.value
 ...
 1 b
 3 d

You could of course store self._value and def value(self):return self._value to be closer to your syntax)

>So my question is: Can you think of an easy way to write something that 
>looks like a generator (using yield), but can also incorporate methods other 
>than next?
>
See above.

Regards,
Bengt Richter



More information about the Python-list mailing list