I'm playing with Python callable. Basically you can define a python class and implement __call__
method to make the instance of this class callable. e.g.,
class AwesomeFunction(object):
def __call__(self, a, b):
return a+b
Module inspect has a function getargspec, which gives you the argument specification of a function. However, it seems I cannot use it on a callable object:
fn = AwesomeFunction()
import inspect
inspect.getargspec(fn)
Unfortunately, I got a 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
I think it's quite unfortunate that you can't treat any callable object as function, unless I'm doing something wrong here?
If you need this functionality, it is absolutely trivial to write a wrapper function that will check to see if fn
has an attribute __call__
and if it does, pass its __call__
function to getargspec.
If you look at the definition of getargspec
in the inspect module code on svn.python.org. You will see that it calls isfunction
which itself calls:
isinstance(object, types.FunctionType)
Since, your AwesomeFunction
clearly is not an instance of types.FunctionType
it fails.
If you want it to work you should try the following:
inspect.getargspec(fn.__call__)
__call__
defines something that can be called by a class instance. You're not giving getargspec
a valid function because you're passing a class instance to it.
The difference between __init
and __call__
is this:
fn = AwesomeFunction() # call to __init__
fn(1, 2) # call to __call__
来源:https://stackoverflow.com/questions/3999463/cant-get-argspec-for-python-callables