[Python-Dev] code blocks using 'for' loops and generators

Brian Sabbey sabbey at u.washington.edu
Sat Mar 12 21:36:10 CET 2005


On Fri, 11 Mar 2005, Josiah Carlson wrote:

> My first reaction to the proposal was "ick".  Why?  Because every time
> I've seen a mechanism for modifying the internals of generators
> constructed using yield, the syntax has been awful; in my opinion
> (whether my opinion means anything is another matter), the syntax you
> propose is quite awful,

I find it quite natural.  Stuff on the right of 'yield' is going out, 
stuff on the left is coming in.  Since 'yield' is different than return in 
that it marks a spot at which execution both leaves and re-enters the 
frame, it makes sense that 'yield' should have a syntax that indicates as 
much.

> and the functionality you desire does not
> require syntax modification to be possible.

Was the functionality provided by generators or decorators or anything 
else impossible before those were introduced?  Of course not.  The point 
is to make things easier and more natural, not to enable some previously 
impossible functionality.

> Strawman 1: the syntax
>
> def pickled_file(name):
>     f = open(name, 'r')
>     l yield pickle.load(f)
>     ^
> ------
> |    f.close()
> |    f = open(name, 'w')
> |    pickle.dump(l, f)
> |    f.close()
> |
> While this is currently a syntax error, it is not clear that an
> assignment is happening /at all/, and I don't believe it would be /even
> if/ if were documented, and every time someone opened up Python it said
> "This is an assignment!" with an example. It looks too magical to me
> (and from a guy who had previously proposed 'Some' as the opposite of
> 'None', that's saying something).

Perhaps you are right, I don't know.  It seems to me that most people 
would have to see the syntax once to know exactly what is going on, but I 
certainly don't know that for sure.  Either way, I'd hate to have all my 
suggestions dismissed because of the syntax of this one piece.

> Strawman 2: putting data back into a generator
>
> def pickled_file(name):
>     f = open(name, 'r')
>     yield pickle.load(f)
>     f.close()
>     f = open(name, 'w')
>     pickle.dump(l, f)
>     f.close()
>
> Keep your code, except toss that leading 'l'.
>
> for l in pickled_file('greetings.pickle'):
>     l.append('hello')
>     l.append('howdy')
>
> Toss that 'continue l', and your code will work (as long as both the
> function and the for are sitting in the same namespace).

But they're *not* in the same namespace necessarily.  That is entirely the 
point.  One is changing scope but has no clean way to pass values.  How is 
making 'l' some (more) global variable possibly a clearer way to pass it 
to the generator?  Your argument is like saying one does not need to 
return values from a function because we could always just use a global 
variable to do it.

> Hrm, not good enough?  Use a Queue, or use another variable in a
> namespace accessable to both your function and your loop.

Again, I entirely realize it's possible to do these things now, but that 
is not the point.

> I'm sorry if this email comes off harsh,

I'm just relieved someone responded :)

-Brian



More information about the Python-Dev mailing list