Pourquoi le eval
de Python ne fonctionne pas dans une fonction? Le même code fonctionne dans un environnement global, mais ne fonctionne pas dans la fonction foo
.Python eval ne fonctionne pas dans une fonction
Exemple simple:
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)
Ceci est la sortie et le message d'erreur:
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
êtes-vous sûr que vous ne souhaitez pas affecter sa valeur à quelque chose? –
Juste essayé ceci: 'x' finit dans la dict' locals', tout comme avec exec, mais alors que 'exec (cmd)' fonctionne dans la fonction, 'eval (compile (...))' ne fait pas. –
Aussi, si vous mettez 'eval (" x ")' au lieu de 'x' dans' print 'foo: x =', x' cela fonctionne aussi. Même comportement dans les deux, Python 2.7 et Python 3.4 –