繁体   English   中英

Python Eval执行环境

[英]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结果。

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

evalexec不会本质上创建模块对象,匿名或其他方式也不会创建任何函数对象(当然,当然:除非您exec defexec语句)。

编辑 :例如,给定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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM