无法获取Python可调用对象的argspec?
我在玩Python的可调用对象。简单来说,你可以定义一个Python类,并实现__call__
方法,这样这个类的实例就可以像函数一样被调用。例如:
class AwesomeFunction(object):
def __call__(self, a, b):
return a+b
Python的inspect模块有一个叫getargspec的函数,可以用来获取一个函数的参数信息。不过,我发现我不能在一个可调用对象上使用它:
fn = AwesomeFunction()
import inspect
inspect.getargspec(fn)
不幸的是,我遇到了一个类型错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python2.6/inspect.py", line 803, in getargspec
raise TypeError('arg is not a Python function')
TypeError: arg is not a Python function
我觉得很遗憾的是,不能把任何可调用对象当作函数来使用,除非我在这里做错了什么?
3 个回答
0
__call__
是用来定义一个可以被类的实例调用的东西。你传给 getargspec
的不是一个有效的函数,因为你传的是一个类的实例。
__init__
和 __call__
的区别在于:
fn = AwesomeFunction() # call to __init__
fn(1, 2) # call to __call__
7
如果你查看一下在 inspect 模块中的 getargspec
的定义,你会发现它调用了 isfunction
,而 isfunction
又会调用:
isinstance(object, types.FunctionType)
因为你的 AwesomeFunction
显然不是 types.FunctionType
的一个实例,所以它会失败。
如果你想让它正常工作,可以尝试以下方法:
inspect.getargspec(fn.__call__)
10
如果你需要这个功能,其实很简单。你只需要写一个包装函数,来检查一下 fn
这个东西有没有一个叫 __call__
的属性。如果有的话,就把它的 __call__
函数传给 getargspec 这个函数。