Python eval在函数内不起作用 [英] Python eval doesn't work inside a function

查看:514
本文介绍了Python eval在函数内不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么Python的 eval 不能在函数内部工作?相同的 eval(compile(cmd))代码在全局环境中工作,但不能在 foo 函数内工作

简单的例子:

  fn ='/ tmp / tmp '
mode ='single'

def foo(cmd,fn,mode):
eval(compile(cmd,fn,mode))#<<<这不起作用
print'foo:cmd =',cmd
print'foo:x =',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)

这是输出和错误信息:

 全局范围:cmd = x = 1 
全局范围:x = 1
foo:cmd = x = 9
foo:x =
Traceback(最近一次调用最后一次):
在< module>文件中的第20行ctest.py
foo('x = 9',fn,mode)
文件ctest.py,第12行,在foo中
print'foo:x =',x
NameError :全局名称'x'未定义


解决方案

函数中,执行没有任何问题,但是 x locals()结尾,然后 print 语句试图在 globals()中找到 x ,这样就引发了 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)

输出: / p>

 全局范围: 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


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

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 is the output 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

解决方案

In your function, the execution does work but x ends up in locals(), and then the print statement tries to find x in globals() and so raises the 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

这篇关于Python eval在函数内不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆