Ответ 1
Если вам нужна эта функциональность, абсолютно тривиально написать функцию-оболочку, которая проверит, имеет ли fn
атрибут __call__
, и если это так, передайте его функцию __call__
в getargspec.
Я играю с 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
Я думаю, что очень жаль, что вы не можете рассматривать любой вызываемый объект как функцию, если я не делаю что-то неправильно здесь?
Если вам нужна эта функциональность, абсолютно тривиально написать функцию-оболочку, которая проверит, имеет ли fn
атрибут __call__
, и если это так, передайте его функцию __call__
в getargspec.
Если вы посмотрите на определение getargspec
в модуле inspect на svn.python.org. Вы увидите, что он вызывает isfunction
, который сам вызывает:
isinstance(object, types.FunctionType)
Так как ваш AwesomeFunction
явно не является экземпляром types.FunctionType
, он терпит неудачу.
Если вы хотите, чтобы он работал, вы должны попробовать следующее:
inspect.getargspec(fn.__call__)
__call__
определяет то, что может быть вызвано экземпляром класса. Вы не даете getargspec
действительную функцию, потому что вы передаете ему экземпляр класса.
Разница между __init
и __call__
такова:
fn = AwesomeFunction() # call to __init__
fn(1, 2) # call to __call__