exec() 在函数 python3.x 中不起作用

Ank*_*lik 9 python exec python-3.x

我正在尝试运行此代码,但似乎exec()没有执行函数内的字符串:

def abc(xyz):
    for i in fn_lst:
        s = 'temp=' + i + '(xyz)'
        exec(s)
        print (temp)

abc('avdfbafadnf')
Run Code Online (Sandbox Code Playgroud)

我收到的错误:

NameError                                 Traceback (most recent call last)
<ipython-input-23-099995c31c78> in <module>()
----> 1 abc('avdfbafadnf')

<ipython-input-21-80dc547cb34f> in abc(xyz)
      4         s = 'temp=' + i + '(word)'
      5         exec(s)
----> 6         print (temp)

NameError: name 'temp' is not defined
Run Code Online (Sandbox Code Playgroud)

fn_lst 是一个函数名称列表,即: ['has_at', 'has_num' ...]

exec()如果可能,请让我知道在这种情况下的替代方案。

DrM*_*DrM 8

要使由传递给 exec() 的字符串设置的变量在调用之外可用,请像这样使用 exec():

exec( a_string, globals(), locals() )
Run Code Online (Sandbox Code Playgroud)

例如,

exec( 'a = 3', globals(), locals() )

print( a )
Run Code Online (Sandbox Code Playgroud)

将打印以下结果:

3
Run Code Online (Sandbox Code Playgroud)

注意:在这个例子中,单独使用 locals() 就足够了,即省略 globals()。两者都包含在此处以说明更一般的情况。locals() 和/或 globals() 的使用是一个更大的主题的一部分,称为“范围”。您可以在Python 教科书 - Scope 中阅读有关此内容的更多信息


C-3*_*3PO 7

我没有足够的声望点来添加评论,但我想提一下 DrM 之前的答案不起作用(在函数内):

def test():
    exec( 'a = 3', globals(), locals() )
    print(a)
test()
Run Code Online (Sandbox Code Playgroud)

这段代码在 Python 3 中给出了一个错误:

NameError: name 'a' is not defined
Run Code Online (Sandbox Code Playgroud)

我使用compile其他论坛中建议的功能尝试了一些方法,但它们仍然对我不起作用(至少对于我所看到的选项)。

根据我的研究,这是我见过的最接近的代码:

def test():
    lcls = locals()
    exec( 'a = 3', globals(), lcls )
    a = lcls["a"]
    print(f'a is {a}')
test()
Run Code Online (Sandbox Code Playgroud)

它成功打印:

a is 3
Run Code Online (Sandbox Code Playgroud)

我认为这是一个很重要的话题。有时,当您使用符号代数库(如 Sympy)时,虽然该exec函数对于科学计算来说非常方便,但定义变量。

我希望有人知道这个问题的好答案。


Jim*_*ard 1

不要exec与函数名称一起使用,只需将函数对象保留在列表中即可:

fn_lst = [has_at, has_num, ...]
Run Code Online (Sandbox Code Playgroud)

并直接执行调用:

def abc(xyz):
    for i in fn_lst:
        temp= i(xyz)
        print(temp)
Run Code Online (Sandbox Code Playgroud)