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

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

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本身在这里很好,可以用正确的结果调用。你知道吗

有谁能告诉我如何将这样的代码注入本地名称空间吗?具体来说,我想创建两个函数,其中一个引用另一个。你知道吗

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

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

理想情况下,我希望避免在函数场景中使用函数

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

    return plus_one(x) + 1

这项技术实际上是可行的,但我需要两个显式命名的独立函数。

需要在对exec()的调用中添加globals()字典。您也可以省略对plus\u 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()
扫描二维码关注公众号,回复: 17029009 查看本文章

猜你喜欢

转载自blog.csdn.net/xifenglie123321/article/details/132186715