Dlaczego Python's eval
nie działa w funkcji? Ten sam kod eval(compile(cmd))
działa w środowisku globalnym, ale nie działa wewnątrz funkcji foo
.Python eval nie działa wewnątrz funkcji
Prosty przykład:
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)
Jest to przesłanie wyjścia i błędów:
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
jesteś pewien, że nie chcesz, aby przypisać jej wartość do czegoś? –
Po prostu próbowałem tego: 'x' kończy się w' locals' dict, podobnie jak w 'exec', ale gdy' exec (cmd) 'działa w funkcji,' eval (kompilacja (...)) ' nie. –
Również, jeśli wstawisz 'eval (" x ")' zamiast 'x' w' print 'foo: x =', x' to też działa. To samo zachowanie zarówno w Pythonie 2.7, jak i Pythonie 3.4 –