Python exec()问题

Python exec()问题,python,python-3.x,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, cod

我有这个密码:

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)
执行时,会出现以下错误:

因此,我在代码的开头添加了
foo=0
,得到了以下输出:

现在,显然,它也应该输出
成功
,但它不是

有什么问题吗


使用python3.

正确的方法是在python3中将dict传递给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

注意,默认局部变量的作用如下面函数locals()所述:不应尝试修改默认局部变量字典。如果需要在函数exec()返回后查看代码对局部变量的影响,请传递显式局部变量字典


您还需要捕获这样一种情况:如果变量>1,则
为False,因为您将永远不会执行代码,因此将永远不会添加foo。

正确的方法是在python3中将dict传递给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

注意,默认局部变量的作用如下面函数locals()所述:不应尝试修改默认局部变量字典。如果需要在函数exec()返回后查看代码对局部变量的影响,请传递显式局部变量字典


你还需要抓住你的
if variable>1
为假的情况,因为你永远不会执行代码,所以foo永远不会被添加。

阅读@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()
在Python3中是一个函数而不是一个语句,因此
foo
被用作局部变量。(来源:@Padraic Cunningham)

阅读@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()
在Python3中是一个函数而不是一个语句,因此
foo
被用作局部变量。(来源:@Padraic Cunningham)

代码执行得很好,有
>1
然后换行并
成功
@l'l'l,你在使用python3吗?@Padraickenningham,我尝试了
2.7.6
3.4.3
(在python3中失败得很惨),抱歉我没有提到这一点。你的回答让我好奇——这会被视为一种范围界定吗?@l'l,基本上是的,除非我们通过我们自己的dict locals()来使用,否则对它的任何更改都不会反映在exec的范围之外。代码执行得很好,
>1
然后换行并成功
@l'l'l,你在用python3吗?@padraiccnningham,我尝试了
2.7.6
3.4.3
(在python3中失败得很惨),抱歉我没有提到这一点。你的回答让我好奇——这会被视为一种范围界定吗?@l'l,基本上是的,除非我们通过我们自己的dict locals()来使用,否则对它的任何更改都不会反映在exec的范围之外。好的,你的回答引导我找到了我的解决方案,我将要发布。谢谢。经过几年的不接受解决方案(我不知道为什么),我认为你的答案比我的好,所以我给你检查。好的,你的答案引导我找到了我的解决方案,我即将发布。谢谢。经过几年不接受解决方案(我不知道为什么),我认为你的答案比我的好,所以我给你支票。