[Python-Dev] metaclass insanity

Aahz aahz@pythoncraft.com
Tue, 5 Nov 2002 10:13:33 -0500


On Tue, Nov 05, 2002, Just van Rossum wrote:
> Just van Rossum wrote:
>> 
>> class Outer:
>>     [snip snip]
>>     def __iter__(self):
>>         while not self.isAtEnd():
>>             result = self.outer.currentState()
>>             self.outer.advanceState()
>>             yield result
> 
> PS, getting more off-topic, I'm somewhat surprised that the above is more
> compact and readable than the obvious generator-less equivalent:
> 
> class Outer:
>     [snip snip]
>     def __iter__(self):
>         return self
>     def next(self):
>         if self.isAtEnd():
>             raise StopIteration
>         else:
>             result = self.outer.currentState()
>             self.outer.advanceState()
>             return result

Hmmmm...  I'm surprised that you're surprised.  Here's my slide from
OSCON2002:

Generators simpler 
    No need to explicitly maintain state 

Iterators more controllable 
    Can manipulate internal state (e.g., __del__ method on iterator
    object to handle cleanup)

    Can be backported to older versions of Python

Generally speaking, I can think of few reasons to build an actual
iterator class rather than a generator.
-- 
Aahz (aahz@pythoncraft.com)           <*>         http://www.pythoncraft.com/

Project Vote Smart: http://www.vote-smart.org/