Russell wrote: > I want my code to be Python 3000 compliant, and hear > that lambda is being eliminated. The problem is that I > want to partially bind an existing function with a value > "foo" that isn't known until run-time: > > someobject.newfunc = lambda x: f(foo, x) > > The reason a nested function doesn't work for this is > that it is, well, dynamic. I don't know how many times > or with what foo's this will be done.
I don't understand this argument here. The code above is almost exactly equivalent to: def newfunc(x): return f(foo, x) someobject.newfunc = newfunc Observe: >>> class C(object): ... pass ... >>> someobject = C() >>> someobject.newfunc = lambda x: f(foo, x) >>> import dis >>> dis.dis(someobject.newfunc) 1 0 LOAD_GLOBAL 0 (f) 3 LOAD_GLOBAL 1 (foo) 6 LOAD_FAST 0 (x) 9 CALL_FUNCTION 2 12 RETURN_VALUE >>> def newfunc(x): ... return f(foo, x) ... >>> someobject.newfunc = newfunc >>> dis.dis(someobject.newfunc) 2 0 LOAD_GLOBAL 0 (f) 3 LOAD_GLOBAL 1 (foo) 6 LOAD_FAST 0 (x) 9 CALL_FUNCTION 2 12 RETURN_VALUE Note that both the lambda and the function have exactly the same byte-code. The only real difference is that if you use a def-statement instead of a lambda, your function will get a real name, "newfunc", instead of <lambda>. STeVe -- http://mail.python.org/mailman/listinfo/python-list