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

Guido van Rossum guido at digicool.com
Thu Jan 25 14:35:12 CET 2001


> 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/)



More information about the Stackless mailing list