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

12 投票
4 回答
3036 浏览
提问于 2025-04-16 10:59

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

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对象,它有一些属性,比如argsdefaults

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对象,它也有argsdefaults这些属性:

ArgSpec(args=['arg1'], varargs=None, keywords=None, defaults=('a default value',))

撰写回答