Python eval not working inside function

Why is Python eval not working inside a function? The same eval(compile(cmd)) code works in the global environment, but does not work inside the foo function.

A simple example:

 fn = '/tmp/tmp' mode = 'single' def foo(cmd, fn, mode): eval(compile(cmd, fn, mode)) # <<< this does not work print 'foo: cmd=', cmd print 'foo: x=', x cmd = "x = 1" eval(compile(cmd, fn, mode)) # <<< this works print 'global scope: cmd=', cmd print 'global scope: x=', x del(x) foo('x = 9', fn, mode) 

This message and error message:

 global scope: cmd= x = 1 global scope: x= 1 foo: cmd= x = 9 foo: x= Traceback (most recent call last): File "ctest.py", line 20, in <module> foo('x = 9', fn, mode) File "ctest.py", line 12, in foo print 'foo: x=', x NameError: global name 'x' is not defined 
+7
function python eval global-variables exec
source share
1 answer

In your function, execution works, but x ends with locals() , and then the print statement tries to find x in globals() and therefore raises the value of NameError .

 fn = '/tmp/tmp' mode = 'single' def foo(cmd, fn, mode): eval(compile(cmd, fn, mode)) print 'locals:', locals() print 'foo: cmd=', cmd print 'foo: x=', locals()['x'] cmd = "x = 1" eval(compile(cmd, fn, mode)) print 'global scope: cmd=', cmd print 'global scope: x=', x del(x) foo('x = 9', fn, mode) 

Outputs:

 global scope: cmd= x = 1 global scope: x= 1 locals: {'x': 9, 'cmd': 'x = 9', 'mode': 'single', 'fn': '/tmp/tmp'} foo: cmd= x = 9 foo: x= 9 
+4
source share

All Articles