Python Eval执行环境

时间:2010-02-28 07:17:10

标签: python eval exec

我不明白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的范围内进行设置。

1 个答案:

答案 0 :(得分:2)

“本地”字典是在execeval期间设置所有名称的地方。 “global”用于查找“本地”名称中未找到的名称,但除非您exec包含global语句的代码,否则不会在此处设置名称。

任何模块对象都不是由evalexec内在创建的,也不是任何函数对象,匿名或其他(当然,除非你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!