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
_______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com