Не удается получить argspec для вызовов Python?

Я играю с 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

Я думаю, что очень жаль, что вы не можете рассматривать любой вызываемый объект как функцию, если я не делаю что-то неправильно здесь?

Ответ 1

Если вам нужна эта функциональность, абсолютно тривиально написать функцию-оболочку, которая проверит, имеет ли fn атрибут __call__, и если это так, передайте его функцию __call__ в getargspec.

Ответ 2

Если вы посмотрите на определение getargspec в модуле inspect на svn.python.org. Вы увидите, что он вызывает isfunction, который сам вызывает:

isinstance(object, types.FunctionType)

Так как ваш AwesomeFunction явно не является экземпляром types.FunctionType, он терпит неудачу.

Если вы хотите, чтобы он работал, вы должны попробовать следующее:

inspect.getargspec(fn.__call__)

Ответ 3

__call__ определяет то, что может быть вызвано экземпляром класса. Вы не даете getargspec действительную функцию, потому что вы передаете ему экземпляр класса.

Разница между __init и __call__ такова:

fn = AwesomeFunction() # call to __init__
fn(1, 2) # call to __call__