无法获得Python callables的argspec?

时间:2010-10-22 17:39:53

标签: python reflection inspection

我正在使用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

我认为你不能将任何可调用对象视为函数是非常不幸的,除非我在这里做错了什么?

3 个答案:

答案 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__