Let\'s suppose we have a function like this:
def myFunction(arg1=\'a default value\'):
pass
We can use introspection to find out the name
As an alternative to rooting around in the attributes of the function you can use the inspect module for a slightly friendlier interface:
For Python 3.x interpreters:
import inspect
spec = inspect.getfullargspec(myFunction)
Then spec is a FullArgSpec
object with attributes such as args
and defaults
:
FullArgSpec(args=['arg1'], varargs=None, varkw=None, defaults=('a default value',), kwonlyargs=[], kwonlydefaults=None, annotations={})
Some of these attributes are not available on Python 2 so if you have to use an old version inspect.getargspec(myFunction)
will give you a similar value without the Python 3 features (getargspec
also works on Python 3 but has been deprecated since Python 3.0 so don't use it):
import inspect
spec = inspect.getargspec(myFunction)
Then spec is an ArgSpec
object with attributes such as args
and defaults
:
ArgSpec(args=['arg1'], varargs=None, keywords=None, defaults=('a default value',))
If you define a function f
like this:
>>> def f(a=1, b=True, c="foo"):
... pass
...
in Python 2, you can use:
>>> f.func_defaults
(1, True, 'foo')
>>> help(f)
Help on function f in module __main__:
f(a=1, b=True, c='foo')
whereas in Python 3, it's:
>>> f.__defaults__
(1, True, 'foo')
>>> help(f)
Help on function f in module __main__:
f(a=1, b=True, c='foo')
The inspect.signature
also provides a nice way to iterate parameters of a function https://docs.python.org/3/library/inspect.html#inspect.signature
import inspect
def f(*cake, one, two=None, three=3): pass
s = inspect.signature(f)
# <Signature (*cake, one, two=None, three=3)>
s.parameters['three'].default
3
s.parameters['cake'].kind
# <_ParameterKind.VAR_POSITIONAL: 2>
s.parameters['cake'].name
'cake'
My bad. Of course, there's myFunction.func_defaults
.