如何在Python中的另一个函数中找出特定函数参数的默认值?

Sri*_*nth 8 python introspection default-parameters

我们假设我们有这样的函数:

def myFunction(arg1='a default value'):
  pass
Run Code Online (Sandbox Code Playgroud)

我们可以用自省,找出该参数的名称myFunction()需要使用myFunction.func_code.co_varnames,但如何找出的默认值arg1(这是'a default value'在上面的例子)?

Dun*_*can 10

作为在函数属性中生根的替代方法,您可以使用inspect模块获得更友好的界面:

对于Python 3.x解释器:

import inspect
spec = inspect.getfullargspec(myFunction)
Run Code Online (Sandbox Code Playgroud)

然后规范是一个FullArgSpec与属性,如对象argsdefaults:

FullArgSpec(args=['arg1'], varargs=None, varkw=None, defaults=('a default value',), kwonlyargs=[], kwonlydefaults=None, annotations={})
Run Code Online (Sandbox Code Playgroud)

其中一些属性在Python 2上不可用,因此如果必须使用旧版本,inspect.getargspec(myFunction)则会在没有Python 3功能的情况下为您提供类似的值(getargspec也适用于Python 3,但自Python 3.0以来已弃用,因此不要使用它) :

import inspect
spec = inspect.getargspec(myFunction)
Run Code Online (Sandbox Code Playgroud)

然后规范是一个ArgSpec与属性,如对象argsdefaults:

ArgSpec(args=['arg1'], varargs=None, keywords=None, defaults=('a default value',))
Run Code Online (Sandbox Code Playgroud)

  • 这样更好,因为你还获得了变量名称以及它们的默认值(如果存在)! (2认同)

Tim*_*ker 9

如果你定义这样的函数f:

>>> def f(a=1, b=True, c="foo"):
...     pass
...
Run Code Online (Sandbox Code Playgroud)

在Python 2中,您可以使用:

>>> f.func_defaults
(1, True, 'foo')
>>> help(f)
Help on function f in module __main__:
f(a=1, b=True, c='foo')
Run Code Online (Sandbox Code Playgroud)

而在Python 3中,它是:

>>> f.__defaults__
(1, True, 'foo')
>>> help(f)
Help on function f in module __main__:
f(a=1, b=True, c='foo')
Run Code Online (Sandbox Code Playgroud)

  • 查看Duncan的答案,它比这个好得多. (2认同)