At 11:26 23.04.2004 -0700, Guido van Rossum wrote:
My reasons for (still!) preferring late binding are:
(a) I find it hard to defend automatic variable capture given Python's general late-binding semantics
I have been thinking about reason (a), the point is that a genexp is not simply a new way to introduce a closure, it is not simply sugar over lambda or def. A genexp is sugar for defining on the fly a generator closure and second instatiating it! Now there are two parts to that, it is true that closures in Python have late-bindings semantics but when they are deployed people in most cases use idioms that circuvent and neutralize late-bindings. def make_show_action(msg): def action(evt,msg): show(msg) return action used as for act,msg in msgs: pnl.add(Button(act,action=make_show_action(msg)) or for act,msg in msgs: pnl.add(Button(act,lambda msg=msg: show(msg))) in fact here lambda has late-bindings semantics and we eschew them by not having any free variable at all. Of course here enters (b), mixing for and genexp is advanced use. That's really a gut-feelings call at this point. For most practical cases, for closures, late-bindings sematics seems something to keep under control, it's an implementation detail to allow recursive and mutally recursive nested functions. So to repeat genexp have no simple direct correspondence to a lambda or a def. They are sugar for some more involved code, so I think it is more a call of what is the general idiomatic form for that kind of code, also maybe considering that the genexp is hiding the details of what is really going on (kind of supplying sheep's clothes to a wolf). Maybe the sane thing is late-bindings, maybe early. But I don't think that as suggested by (a) that there is some deep design logic internal to Python at stake here. At most the argument could be that late-bindings make things easier to explain because they are kind of like lambdas. Maybe, maybe not. Then there is (b).
(b) I believe that use cases needing early binding are uncommon and strained: they all involve creating a list of generator expressions, which IMO is a pretty unusual thing to do
regards