Intended to work? (lambda x,y:map(eval, ["x", "y"]))(2,3)

In a function like this: def f(x): return eval("x") , eval uses the local function namespace, and the above works. This is according to chapter 2.3 of the Python library ref. Now on my problem: When eval() is used with map, the same mechanism takes place: def f(x): return map(eval,["x"]) It works the same as the above, because map is a builtin function that does not modify the frame chain, so eval finds the local namespace. Not so with Stackless Python (at the moment), since Stackless map assigns an own frame to map without passing the correct namespaces to it. (Reported by Bernd Rinn) Question: Is this by chance, or is eval() *meant* to function with the local namespace, even if it is executed in the context of a function like map() ? The description of map() does not state whether it has to pass its surrounding namespace to the mapped function, and if one simulates map() by writing one's own python implementation, it will fail exactly like Stackless does today. The same applies to apply(). I think I should fix Stackless here, anyway? ciao - chris -- Christian Tismer :^) <mailto:tismer@tismer.com> Mission Impossible 5oftware : Have a break! Take a ride on Python's Kaunstr. 26 : *Starship* http://starship.python.net 14163 Berlin : PGP key -> http://wwwkeys.pgp.net PGP Fingerprint E182 71C7 1A9D 66E9 9D15 D3CC D4D7 93E2 1FAE F6DF where do you want to jump today? http://www.stackless.com

In a function like this:
def f(x): return eval("x")
, eval uses the local function namespace, and the above works. This is according to chapter 2.3 of the Python library ref.
Now on my problem: When eval() is used with map, the same mechanism takes place:
def f(x): return map(eval,["x"])
It works the same as the above, because map is a builtin function that does not modify the frame chain, so eval finds the local namespace. Not so with Stackless Python (at the moment), since Stackless map assigns an own frame to map without passing the correct namespaces to it. (Reported by Bernd Rinn)
Question: Is this by chance, or is eval() *meant* to function with the local namespace, even if it is executed in the context of a function like map() ?
Map, being a built-in, is transparent to namespaces.
The description of map() does not state whether it has to pass its surrounding namespace to the mapped function, and if one simulates map() by writing one's own python implementation, it will fail exactly like Stackless does today. The same applies to apply().
So you can't simulate a built-in.
I think I should fix Stackless here, anyway?
Yes. Note: beware of Jeremy's nested scopes. That adds a whole slew of namespaces! (But eval() is more crippled there.) --Guido van Rossum (home page: http://www.python.org/~guido/)
participants (2)
-
Christian Tismer
-
Guido van Rossum