gpt4 book ai didi

python - Python 中函数内函数的动态变化

转载 作者:太空宇宙 更新时间:2023-11-03 18:20:48 25 4
gpt4 key购买 nike

尝试基于从字符串中提取函数来在 Python 中进行一些动态函数更改:

目标是能够在运行时根据用户输入用从字符串解释的新函数替换函数。

我一直在尝试使用 exec 函数作为将文本解释为函数的一种方式,但在更新其他函数中的函数时它似乎不起作用。

到目前为止我所拥有的是

>>> exec( "def test(x): print( x + 8 )" )
>>> test(8)
16

不过,这很好用-

>>> def newTest( newTestString ):
initString = "def test(x): "
exec( initString + newTestString )
>>> newTest( "print( x + 20 )" )
>>> test(10)
18

失败,可以在函数内使用 exec 吗?

最佳答案

exec() 可以在函数中使用,你只需要记住新对象是在哪个命名空间中创建的。您需要从您的本地命名空间返回它:

>>> def newTest(newTestString):
... initString = "def test(x): "
... exec(initString + newTestString)
... return test
...
>>> newTest("print x + 20")
<function test at 0x10b06f848>
>>> test = newTest("print x + 20")
>>> test(10)
30

这仅适用于 Python 2,在使用 exec 时,正常的本地命名空间优化将被禁用。在 Python 3 中,给 exec() 一个命名空间来创建新对象in,然后检索新函数并返回它:

>>> def newTest(newTestString):
... initString = "def test(x): "
... ns = {}
... exec(initString + newTestString, ns)
... return ns['test']
...
>>> newTest("print(x + 20)")
<function test at 0x110337b70>
>>> test = newTest("print(x + 20)")
>>> test(10)
30

此方法在 Python 2 中同样有效,而且还有一个额外的优点,即本地命名空间优化也不会被禁用。

原则上,您也可以指示 exec 直接在全局命名空间中工作:

exec(initString + newTestString, globals())

但像所有全局变量一样,应该避免这种副作用。

关于python - Python 中函数内函数的动态变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24190451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com