Не можете получить argspec для вызываемых в Python? - PullRequest
12 голосов
/ 22 октября 2010

Я играю с вызываемым Python. По сути, вы можете определить класс python и реализовать метод __call__, чтобы сделать экземпляр этого класса вызываемым. например.,

class AwesomeFunction(object):
    def __call__(self, a, b):
        return a+b

Модуль 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 ]

6 голосов
/ 22 октября 2010

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

5 голосов
/ 22 октября 2010

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

isinstance(object, types.FunctionType)

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

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

inspect.getargspec(fn.__call__)
0 голосов
/ 22 октября 2010

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

Разница между __init и __call__ заключается в следующем:

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