无法获取Python可调用对象的argspec?

15 投票
3 回答
4402 浏览
提问于 2025-04-16 05:55

我在玩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 这个函数。

撰写回答