I'd like to find out the arity of a method in Python (the number of parameters that it receives). Right now I'm doing this:
def arity(obj, method): return getattr(obj.__class__, method).func_code.co_argcount - 1 # remove self class Foo: def bar(self, bla): pass arity(Foo(), "bar") # => 1
I'd like to be able to achieve this:
Foo().bar.arity() # => 1
Update: Right now the above function fails with built-in types, any help on this would also be appreciated:
# Traceback (most recent call last): # File "bla.py", line 10, in <module> # print arity('foo', 'split') # => # File "bla.py", line 3, in arity # return getattr(obj.__class__, method).func_code.co_argcount - 1 # remove self # AttributeError: 'method_descriptor' object has no attribute 'func_co
inspect.getargspec(func) returns a tuple with four items, args, varargs, varkw, defaults : len(args) is the "primary arity", but arity can be anything from that to infinity if you have varargs and/or varkw not None , and some arguments may be omitted (and defaulted) if defaults is not None .
Arity (/ˈærɪti/ ( listen)) is the number of arguments or operands taken by a function, operation or relation in logic, mathematics, and computer science. In mathematics, arity may also be named rank, but this word can have many other meanings in mathematics.
Fixed arity function is the most popular kind present in almos tall programming languages. Fixed arity function must be called with the same number of arguments as the number of parameters specified in its declaration. Definite arity function must be called with a finite number of arguments.
Module inspect
from Python's standard library is your friend -- see the online docs! inspect.getargspec(func)
returns a tuple with four items, args, varargs, varkw, defaults
: len(args)
is the "primary arity", but arity can be anything from that to infinity if you have varargs
and/or varkw
not None
, and some arguments may be omitted (and defaulted) if defaults
is not None
. How you turn that into a single number, beats me, but presumably you have your ideas in the matter!-)
This applies to Python-coded functions, but not to C-coded ones. Nothing in the Python C API lets C-coded functions (including built-ins) expose their signature for introspection, except via their docstring (or optionally via annotations in Python 3); so, you will need to fall back to docstring parsing as a last ditch if other approaches fail (of course, the docstring might be missing too, in which case the function will remain a mystery).
Use a decorator to decorate methods e.g.
def arity(method): def _arity(): return method.func_code.co_argcount - 1 # remove self method.arity = _arity return method class Foo: @arity def bar(self, bla): pass print Foo().bar.arity()
Now implement _arity
function to calculate arg count based on your needs
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With