我想获取 Python 函数的源代码。但是,我正在处理的函数具有使用函数本身实例化的装饰器。这似乎inspect
或dill
有问题。特别是,我尝试了以下 MWE:
class Decorator(object):
def __init__(self, item):
self.item = item
self.func = None
def __call__(self, func):
self.func = func
return self
@Decorator(42)
def fun_1():
pass
@Decorator(lambda x: 42)
def fun_2():
pass
@Decorator(fun_2.item)
def fun_3():
pass
import inspect
print("Inspect results")
print(inspect.getsource(fun_1.func))
print(inspect.getsource(fun_2.func))
print(inspect.getsource(fun_3.func))
import dill
print("Dill results")
print(dill.source.getsource(fun_1.func))
print(dill.source.getsource(fun_2.func))
print(dill.source.getsource(fun_3.func))
对于函数fun_1
和fun_3
,这给出了预期的结果。对于fun_2
(虽然它本质上与 fun_3 相同),inspect
or返回的源代码dill
是错误的——它只给了我装饰器行。我希望得到
@Decorator(lambda x: 42)
def fun_2():
pass
但我得到的只是
@Decorator(lambda x: 42)
我可以想象这两个模块都只是搜索第一个函数声明。inspect
这个假设是否正确,除了重新实现或之外是否有很好的解决方法dill
?
编辑:我使用的是 Python 2.7,但使用 Python 3.4 时遇到了相同的行为。