import os def foo(s): f = lambda a: a + "; print '%s'" % os.getcwd() exec(f(s)) foo("print 'asdf'")
What error does this give? Why?
This one is pretty tough. I'll put a simpler illustration that gives the same error in the comments as a hint.
(Updated to fix inadvertent SyntaxError in the exec'd string, pointed out by Ian Bicking. Python bails with the error I intended before reaching that point, though.)
Comments
import os
def foo(s):
f = lambda: os.gtcwd()
exec(s)
foo("print 'asdf'")
I'm guessing the reason for the error is because f doesn't know if "os" is a local or a global function in the presence of an exec that happens inside the scope of the function. E.g., foo("os=None") would make os a local variable, where otherwise it would be a global variable. Or something. If you use "f = lambda os=os: os.getcwd()" you're all good, because "os" doesn't get looked up in the enclosing scope when f() is called (it's already bound, or rebound by the call). But I'm still fuzzy on the reasoning behind the error.
I can tell you why it won't work in Python 3.0: lambda sucks and will finally be gone. I'd rather have no anonymous methods than a crippled one.
It has nothing to do with lambda. The same effect happens when using a regular def statement.