我有一个在另一个函数中使用exec()
创建的函数,并作为参数传递给主程序。我怎样才能获得所述函数的代码?
我尝试了inspec.getsourcelines()
和inspec.getsource()
,但我收到以下错误
IOError: could not get source code
有解决方法吗?
MWE 主文件:
#!/usr/bin/python
from ext import makeF
import inspect
f=makeF()
f()
inspect.getsource(f)
然后是外部文件:
def makeF():
script="def sayA():\n\tprint('Aah')"
exec(script)
return sayA
答案 0 :(得分:1)
这是不可能的。我一直在挖掘并得出this answer中概述的相同结论。
我不知道您的代码,但我认为在您的具体情况下,您可以返回一个自定义对象,其中包含该函数的源代码(您似乎拥有它 - 您将它传递给exec)以及实际编译功能。您甚至可以利用Python的__call__
魔术方法来更好地模拟原始行为。这是一个示例:
class FunctionWithCode:
def __init__(self, source, func_name):
exec(source)
self.source = source
self.func = locals()[func_name]
def __call__(self, *args, **kwargs):
self.func(*args, **kwargs)
f = FunctionWithCode("def sayA():\n\tprint('Aah')", 'sayA')
f()
按预期打印Aah。您需要在创建对象时知道函数名称,但这与示例代码相同。
答案 1 :(得分:1)
在python 3中,解决方案是函数的__globals__
属性。
用你的例子:
>>> f.__globals__['txt']
"def sayA():\n\tprint('Aah')"
不幸的是我找不到像Python 2那样的东西。
其他方法无法工作的原因是因为它们使用模块的文件名而且这里没有任何文件。