Python exec()问题

时间:2015-07-12 20:29:59

标签: python python-3.x

我有这段代码:

def test(variable, customCode = ""):

    if variable > 1:
        print(">1")

    if customCode != "":
        exec(customCode)

    if foo == 1:
        print("Success")

numb = 12
code = "if variable > 1: foo = 1"

test(numb, code)

执行时会出现以下错误:

Error 1

那么,我在代码的开头添加了foo = 0,得到了这个输出:

Issue 2

现在,显然,它也应该输出Success,但它不是。

问题是什么?

使用Python 3.

2 个答案:

答案 0 :(得分:4)

正确的方法是将一个dict传递给python 3中的exec并按键查找,在python2中你的代码将按原样运行,因为exec是一个语句而不是python3中的函数:

def test(variable, customCode = ""):
    d = {"variable":variable}
    if customCode != "":
        exec(customCode, d)
    if d["foo"] == 1:
        print("Success")

numb = 12
code = "if  variable > 1: foo = 1"

test(numb, code)

输出:

In [13]: numb = 12

In [14]: code = "if  variable > 1: foo = 1"

In [15]: test(numb, code)
Success

exec

  

注意默认的locals的行为与下面的函数locals()相同:不应尝试修改默认的locals字典。如果您需要在函数exec()返回后查看代码对locals的影响,则传递显式的locals字典。

您还需要了解if variable > 1为假的情况,因为您永远不会执行代码,因此永远不会添加foo。

答案 1 :(得分:0)

阅读@Padraic Cunningham的帖子给了我一个想法,作为一个解决方案:

这很简单:不只是: foo = 1,而是: global foo; foo = 1

更改了代码:

def test(variable, customCode = ""):

    if variable > 1:
        print(">1")

    if customCode != "":
        exec(customCode)

    if foo == 1:
        print("Success")

numb = 12
code = "if variable > 1: global foo; foo = 1"

test(numb, code)

问题是exec()是函数而不是Python 3中的语句,因此foo被用作局部变量。 (资料来源:@Padraic Cunningham)