gpt4 book ai didi

python - 从全局环境中的函数内部使用 exec 定义函数

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

我有一个函数,当被调用时,应该使用 exec 定义另一个函数,并使这个新函数可用于主程序。 mwe如下。

主程序:

#!/usr/bin/python
from ext import makeF

makeF()
sayA()

外部模块:

def makeF():
script="def sayA():\n\tprint 'Aah'"
exec(script)
sayA()
return

我想要的是能够从主程序调用内部函数sayA(),所以在这个例子中输出应该是

Aah
Aah

而是返回

Aah
Traceback (most recent call last):
File "mwe.py", line 5, in <module>
sayA()
NameError: name 'sayA' is not defined

这是我所期望的,所以我根据 docsexec(script) 行替换为 exec(script,globals) , 但我得到了

Traceback (most recent call last):
File "mwe.py", line 4, in <module>
makeF()
File "/home/tomas/tests/ext.py", line 3, in makeF
exec(script,globals,locals)
TypeError: exec: arg 2 must be a dictionary or None

我觉得我在这里遗漏了一些非常明显的东西,但我想不通。感谢您的帮助。

谢谢。

最佳答案

您已经在 makeF 中创建了函数,因此它甚至在函数外部的外部模块范围内都不可见。

如果你想从 main 调用它,返回 sayA :

def makeF():
script="def sayA():\n\tprint('Aah')"
exec(script)
return sayA

然后在主要部分:

f = makeF()
f()

要在 python3 中获得相同的行为,其中 exec 不再是语句而是函数,您可以将 lambda 与字典一起使用:

def makeF():
d = {}
"sayA = lambda: print('Aah')"
exec("sayA = lambda: print('Aah')",d)
return d["sayA"]

from ext import makeF

f = makeF()
f()

关于python - 从全局环境中的函数内部使用 exec 定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29812241/

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