eval modifies passed dict

Duncan Booth duncan.booth at invalid.invalid
Mon Apr 14 18:05:23 CEST 2008


Janto Dreijer <jantod at gmail.com> wrote:

> It seems eval is modifying the passed in locals/globals. This is
> behaviour I did not expect and is really messing up my web.py app.
> 
> Python 2.5.1 (r251:54863, Mar  7 2008, 04:10:12)
> [GCC 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)] on linux2
> Type "help", "copyright", "credits" or "license" for more information.
>>>> d = dict(a=1)
>>>> d.keys()
> ['a']
>>>> eval("a", d)
> 1
>>>> d.keys()
> ['a', '__builtins__']
> 
> That can't be right.
> 
That can exactly be right. 

Python always expects a global called '__builtins__'. If it isn't in the
dict you pass to eval to use for globals it will be added. You may, of
course, initialise it yourself if you don't want your script to have
access to all of the standard globals. 

The current document is (I think) wrong or at the least misleading. It 
says:

> If the globals dictionary is present and lacks '__builtins__', the
> current globals are copied into globals before expression is parsed.

I think it should say:

> If the globals dictionary is present and lacks '__builtins__', the
> current value of __builtins__ is added to globals before expression
> is parsed.

i.e. only a single variable is assigned, other globals aren't copied.



More information about the Python-list mailing list