Can't get argspec for Python callables?

2019-04-19 20:02发布

问题:

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?

回答1:

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.



回答2:

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__)


回答3:

__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__