Почему Python's eval
не работает внутри функции? Тот же код eval(compile(cmd))
работает в глобальной среде, но не работает внутри функции foo
.Python eval не работает внутри функции
Простой пример:
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)
Это выход и сообщение об ошибке:
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
вы уверены, что вы не хотите, чтобы присвоить его значение к чему-то? –
Просто попробовал это: 'x' заканчивается в' locals' dict, так же, как и с 'exec', но в то время как' exec (cmd) 'работает внутри функции,' eval (compile (...)) ' не. –
Кроме того, если вы поместите 'eval (« x »)' вместо 'x' в' print 'foo: x =', x', он тоже работает. Такое же поведение и в Python 2.7, и в Python 3.4 –