14

我正在玩 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

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

4

3 回答 3

9

如果你需要这个功能,编写一个包装函数来检查是否fn有一个属性__call__,如果有,将它的__call__函数传递给 getargspec 是非常简单的。

于 2010-10-22T17:56:58.497 回答
6

如果您查看svn.python.org 上getargspec检查模块代码中的定义。你会看到它调用了isfunction它自己调用的:

isinstance(object, types.FunctionType)

因为,你AwesomeFunction显然不是types.FunctionType它失败的一个实例。

如果你想让它工作,你应该尝试以下方法:

inspect.getargspec(fn.__call__)
于 2010-10-22T18:00:24.083 回答
0

__call__定义了可以被类实例调用的东西。您没有提供getargspec有效的功能,因为您将类实例传递给它。

__init和之间的区别__call__是这样的:

fn = AwesomeFunction() # call to __init__
fn(1, 2) # call to __call__
于 2010-10-22T18:04:12.047 回答