[Python-ideas] For-loop variable scope: simultaneous possession and ingestion of cake
tjreedy at udel.edu
Sat Oct 4 16:04:36 CEST 2008
Greg Ewing wrote:
> Arnaud Delobelle wrote:
>> Isn't this better as:
>> buttons.append(Button(title, getattr(game, action)))
>> Unless you want late binding of 'game',
> Well, you might, for example if you implement restoring a
> saved game by unpickling a Game object and assigning it
> to game.
To me, this example and comment proves my point. If you want 'action'
interpolated immediately, to not actually be a variable of each
function, while you want 'game' left to be a true free variable, then
overtly say so specifically in one way or another without magic.
In my opinion, the 'evil default arg hack' does this nicely (though not
completely), especially if a new name is used for the lambda local.
lambda a=action: getattr(game,a)
This is only 4 extra keystrokes. If the function is left anonymous and
only called by clicking a button, there is no danger of a 'user'
accidentally calling the function with an extra arg that overrides the
default. This fact to me eliminates the main objection to the usage.
If one still does not like that for whatever reason, complete value
interpolation is nicely done by
eval("lambda: getattr(game,%s)" % action)
That is 13 extra spaces, including 2 spaces for easier reading.
> There's always some way to rearrange it so that it works,
Also my point.
> but the point is that it's easy to write things like this
> that don't work, unless you really keep your wits about
It is also easy to write things that don't work, unless you really keep
your wits about you, with lists and other mutables, and with floats ;-).
Terry Jan Reedy
More information about the Python-ideas