我不明白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
我希望我的范围中的var结果能够在eval / exec的范围内进行设置。
答案 0 :(得分:2)
“本地”字典是在exec
或eval
期间设置所有名称的地方。 “global”用于查找“本地”名称中未找到的名称,但除非您exec
包含global
语句的代码,否则不会在此处设置名称。
任何模块对象都不是由eval
或exec
内在创建的,也不是任何函数对象,匿名或其他(当然,除非你exec
语句如def
1}}等。)
编辑:例如,给定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]
当前模块的result
中的__dict__
当然不受影响(可以想象 ,因为该dict永远不会传递给{{1}问题?!) - exec
字典当然是受影响的字典,因为它是作为“全球字典”传递的字典,而是 a allowed_builtins
字符串中的语句为global
uted!