[英]Python Eval executing environment
我不了解eval或exec语句在什么环境中执行。您可以将全局范围和局部范围传递给它们,但我不太理解这意味着什么。 python是否会为它们创建一个匿名模块,如果是这种情况,则全局范围和局部范围有何不同?
它像一个匿名函数一样运行吗? 如果是这样的话,尽管我仍然需要调用global var
来防止python在赋值时创建局部变量,但全局和局部作用域对我来说更有意义。
这是一些代码来显示我实际上正在尝试执行的操作。
# module level vars
result = ''
allowed_builtins = {"__builtins__":{'int':int, 'str':str, 'range':range, 'dir':dir,
'zip':zip
},
"result":result}
在班上
def _exec(self, answer, function_name, input):
global result
exec_string = answer + '\n'
exec_string += 'global result; result = %s(%s)' % (function_name, input)
exec exec_string in allowed_builtins, {}
return result
我希望可以在eval / exec的范围内设置我范围内的var结果。
“本地”字典是在exec
或eval
期间设置所有名称的地方; “全局”名称用于查找在“本地”名称中找不到的名称,但是除非您正在exec
包含global
语句的代码,否则不会在其中设置名称。
eval
或exec
不会本质上创建模块对象,匿名或其他方式也不会创建任何函数对象(当然,当然:除非您exec
def
等exec
语句)。
编辑 :例如,给定OP的代码,并假定_exec
是一个独立的函数,因为OP没有给出可能存在的class
,请在末尾添加:
print 'one: %r' % _exec(None, '"foo"', 'range', 7)
print 'two: %r' % allowed_builtins['result']
您将看到以下输出:
one: ''
two: [0, 1, 2, 3, 4, 5, 6]
当前模块的__dict__
的result
当然不会受到影响(可以想象是怎么回事,因为该dict永远不会传递给有问题的exec
?!)- allowed_builtins
字典当然是受影响的那allowed_builtins
,因为它是字典的“全球词典”过去, 有一个global
的字符串中的语句是exec
贡献!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.