如何在Python中查找另一个函数中特定函数参数的默认值?
假设我们有一个这样的函数:
def myFunction(arg1='a default value'):
pass
我们可以通过一种叫做“自省”的方法,来查看这个函数 myFunction()
接受的参数名称,使用 myFunction.func_code.co_varnames
。但是,怎么才能知道 arg1
的默认值是什么呢?在上面的例子中,arg1
的默认值是 'a default value'
。
4 个回答
1
inspect.signature
这个工具可以很方便地让我们查看一个函数的参数。你可以通过它来逐个了解函数需要哪些输入。想了解更多,可以去看看这个链接: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'
10
如果你这样定义一个函数 f
:
>>> def f(a=1, b=True, c="foo"):
... pass
...
在 Python 2 中,你可以这样使用:
>>> f.func_defaults
(1, True, 'foo')
>>> help(f)
Help on function f in module __main__:
f(a=1, b=True, c='foo')
而在 Python 3 中,使用方式是:
>>> f.__defaults__
(1, True, 'foo')
>>> help(f)
Help on function f in module __main__:
f(a=1, b=True, c='foo')
11
作为一种替代方法,你可以使用inspect模块,这样界面会更友好一些,而不是直接去找函数的属性:
对于Python 3.x的解释器:
import inspect
spec = inspect.getfullargspec(myFunction)
这样,spec就是一个FullArgSpec
对象,它有一些属性,比如args
和defaults
:
FullArgSpec(args=['arg1'], varargs=None, varkw=None, defaults=('a default value',), kwonlyargs=[], kwonlydefaults=None, annotations={})
在Python 2中,有些属性是不可用的,所以如果你必须使用旧版本,inspect.getargspec(myFunction)
会给你一个类似的值,但没有Python 3的特性(getargspec
在Python 3中也能用,但自从Python 3.0起就不推荐使用了,所以最好别用):
import inspect
spec = inspect.getargspec(myFunction)
这样,spec就是一个ArgSpec
对象,它也有args
和defaults
这些属性:
ArgSpec(args=['arg1'], varargs=None, keywords=None, defaults=('a default value',))