在 Python 中动态创建函数 -- f(2) 无法解析 (f1)

Creating functions dynamically in Python -- f(2) cannot resolve (f1)

我正在尝试动态创建在一个字符串中定义的 2 个函数。代码:

def  main():

    fns = '''
    def plus_one(x):
    return x + 1


    def plus_two(x):
    return plus_one(x) + 1

    '''
    exec(fns)

    result = eval('plus_two(11)')

    print(result)

if __name__ == '__main__':
    main()

将此代码保存到一个名为 dyn_code.py 和 运行 的文件中,出现以下错误:

python dyn_code.py  
Traceback (most recent call last):   
File "dyn_code.py", line 19, in <module>
main()   
File "dyn_code.py", line 14, in main   
result = eval('plus_two(11)')
File "<string>", line 1, in <module>   
File "<string>", line 7, in plus_two 
NameError: name 'plus_one' is not defined

这里的问题是 plus_one 无法在 plus_two 中解决。

plus_one 本身在这里很好,可以用正确的结果调用。

任何人都可以告诉我如何将这样的代码注入本地名称空间吗?具体来说,我想创建 2 个函数,一个引用另一个。

我有意使用了 execeval 最开放的形式,我知道如何限制它们,等等。我还验证了在调用 exec 这两个函数都存在于本地命名空间中。

更令人沮丧的是代码在解释器会话中运行良好!也就是说,在通过 exec 将这两个函数注入到解释器命名空间后,plus_two 运行没有任何问题。

理想情况下,我想避免函数中函数的情况,即

def plus_two(x):
    def plus_one(x):
        return x + 1

    return plus_one(x) + 1

这项技术确实有效,但我想要 2 个明确命名的独立函数。

函数的缩进 fns 很重要!并且您必须传递 globals() 映射的可选参数!

def  main():
    fns = '''def plus_one(x):
    return x + 1

def plus_two(x):
    return plus_one(x) + 1
    '''
    exec(fns,globals())
    result = eval('plus_two(11)')

    print(result)

if __name__ == '__main__':
    main()

输出:

13

希望对您有所帮助!

您需要在对 exec() 的调用中添加 globals() 词典。您还可以省略 plus_two 的 eval 调用,如下所示:

def  main():
    exec('def plus_one(x):\n    return x + 1\n\ndef plus_two(x):    return plus_one(x) + 1', globals())
    print(plus_two(11))

if __name__ == '__main__':
    main()