代码在函数外部完美执行,但不在内部执行

时间:2018-03-11 14:50:28

标签: python python-3.x runtime-error exec

编辑:此问题上面的链接没有回答一个mod添加了。正如我之前在评论中所说,Python 3带来了变化,这些答案中给出的examples是针对Python 2.如果我在Python 3环境中编译它们,我会得到与此处相同的错误。

考虑

str = "x = [113, 223]"
exec(str)
print(x[0]) #113

这完美无缺。但是,如果我希望在函数中执行此代码,则会返回错误NameError: name 'x' is not defined。这是一个最小的工作示例:

def some_code():
    str = "x = [1, 2]"
    exec(str)
    print(x)

some_code()

这里发生了什么?

我需要一个解决方案

  • 在函数内部使用exec(因为它最终是一个tkinter函数 - 请看这个问题的第一个编辑历史 - 我从一个应该执行的文件中读取它

  • 我想很容易地引用x,因为我需要在很多地方做到这一点。因此,使用一长串代码来引用x会很麻烦。

1 个答案:

答案 0 :(得分:1)

天真地将相关代码移动到第一级范围解决了它。

string = "x = [113, 223]"
exec(string)

def some_code():
    print(x[0]) #113

另一种方法:我开始使用exec()以及我可以看到exec()将其结果(在本例中为x)写入locals()globals()内置词典。因此,以下是该问题的另一种解决方案,但它似乎相当hacky:

def some_code():
    string = "x = [113, 223]"
    exec(string)
    print(locals()['x'][0]) #113

some_code()

以同样的方式,您可以定义自己的字典,而不是locals(),其中exec()存储x,我觉得更清洁:

exec_results = {}

def some_code():
    string = "x = [113, 223]"
    exec(string, None, exec_results)
    print(exec_results['x'][0]) #113

some_code()

我强烈反对将exec()用于此类非常简单的案例,但如果您希望将来使用它,我强烈建议您查看在此问题之前创建的同一主题的其他主题,例如running-exec-inside-functionglobals and locals in python exec()。查看exec()上的Python docs,了解有关exec()的更多信息。