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

前端 未结 4 1741
野的像风
野的像风 2021-01-12 01:01

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

相关标签:
4条回答
  • 2021-01-12 01:28

    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',))
    
    0 讨论(0)
  • 2021-01-12 01:28

    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')
    
    0 讨论(0)
  • 2021-01-12 01:43

    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 讨论(0)
  • 2021-01-12 01:45

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

    0 讨论(0)
提交回复
热议问题