Calling a generator multiple times

Oren Tirosh oren-py-l at
Sat Dec 8 05:44:19 EST 2001

On Sat, Dec 08, 2001 at 12:30:25AM +0000, Courageous wrote:
> >A generator is a function or method that -- by virtue of using the yield
> >statement -- 
> I understand how it works, intuitively. My objection is not that
> I don't understand it, but rather that a lone keyword appearing
> in the content of the method definition actually changes what is
> being defined. That's just plain wrong.

I agree.  It should be immediately apparent that a generator function is 
not a regular instance of the 'function' type.  I believe that the most 
natural way to indicate this is to use the function object's type.  A 
generator function should be an instance of a 'generator' type, a subclass 
of the 'function' type.  It should return a 'generator_iterator' object 
when called.

Here's what the syntax might look like:

  def foo(args)(generator): ...

Why this syntax?  Simply following the same rules as class definitions.  
A class definition has an optional base class or classes in parens; when 
omitted, a default metaclass is used ('class' today, perhaps 'object' 
in the future).  This syntax is the logical result of extending this rule
to functions and defining 'function' as the default metaclass for new 
function definitions.  This default may be overridden, with the only 
alternative being 'generator', at least for now.  There are no new keywords 
required, 'generator' is just a built-in type.

The __future__ mechanism gives a clean way to deprecate the current syntax
where a generator function is defined by the mere presence of a 'yield'
statement somewhere within the function's body.


More information about the Python-list mailing list