我正在使用Python可调用。基本上,您可以定义python类并实现__call__
方法,以使此类的实例可调用。如,
class AwesomeFunction(object):
def __call__(self, a, b):
return a+b
模块检查有一个函数getargspec,它为您提供函数的参数规范。但是,我似乎无法在可调用对象上使用它:
fn = AwesomeFunction()
import inspect
inspect.getargspec(fn)
不幸的是,我遇到了一个TypeError:
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
我认为你不能将任何可调用对象视为函数是非常不幸的,除非我在这里做错了什么?
答案 0 :(得分:6)
如果您需要此功能,那么编写一个包装函数来检查fn
是否具有属性__call__
并且如果它具有属性__call__
,则通过其{{1}}函数是绝对无足轻重的getargspec。
答案 1 :(得分:5)
如果您查看svn.python.org上inspect模块代码中getargspec
的定义。您会看到它调用isfunction
,它本身会调用:
isinstance(object, types.FunctionType)
由于您的AwesomeFunction
显然不是types.FunctionType
的实例,因此失败。
如果您希望它起作用,您应该尝试以下方法:
inspect.getargspec(fn.__call__)
答案 2 :(得分:0)
__call__
定义了一个可以由类实例调用的东西。你没有给getargspec
一个有效的函数,因为你正在向它传递一个类实例。
__init
和__call__
之间的差异是:
fn = AwesomeFunction() # call to __init__
fn(1, 2) # call to __call__