开发者

How to find out the default values of a particular function's argument in another function in Python?

Let's suppose we have a function like this:

def myFunction(arg1='a default value'):
  pass

We can use introspection to find out 开发者_JS百科the names of the arguments that myFunction() takes using myFunction.func_code.co_varnames, but how to find out the default value of arg1 (which is 'a default value' in the above example)?


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


My bad. Of course, there's myFunction.func_defaults.


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'
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜