如何找到Python函数的参数个数?

254 投票
14 回答
156219 浏览
提问于 2025-04-15 11:31

我怎么才能找到一个Python函数的参数数量呢?我需要知道它有多少个普通参数和多少个命名参数。

举个例子:

def someMethod(self, arg1, kwarg1=None):
    pass

这个方法有2个参数和1个命名参数。

14 个回答

43

func.__code__.co_argcount 会告诉你这个函数有多少个参数,这些参数是在 *args 之前的。

func.__kwdefaults__ 会给你一个字典,里面是 关键字参数,这些参数是在 *args 之后的。

func.__code__.co_kwonlyargcount 的值和 len(func.__kwdefaults__) 是一样的,表示关键字参数的数量。

func.__defaults__ 会告诉你在 *args 之前的 可选参数 的默认值。


下面是一个简单的示例:

示例图

>>> def a(b, c, d, e, f=1, g=3, h=None, *i, j=2, k=3, **L):
    pass

>>> a.__code__.co_argcount
7
>>> a.__defaults__
(1, 3, None)
>>> len(a.__defaults__)
3
>>> 
>>> 
>>> a.__kwdefaults__
{'j': 2, 'k': 3}
>>> len(a.__kwdefaults__)
2
>>> a.__code__.co_kwonlyargcount
2
120
import inspect
inspect.getargspec(someMethod)

请查看 inspect模块

238

之前被接受的答案在 Python 3.0 之后已经不再推荐使用了。现在不应该再用 inspect.getargspec,而是应该使用取而代之的 Signature 类。

通过 signature 函数 创建一个函数的签名非常简单:

from inspect import signature

def someMethod(self, arg1, kwarg1=None):
    pass

sig = signature(someMethod)

现在,你可以通过 str 来快速查看它的参数:

str(sig)  # returns: '(self, arg1, kwarg1=None)'

或者你也可以通过 sig.parameters 获取属性名称和参数对象的对应关系。

params = sig.parameters 
print(params['kwarg1']) # prints: kwarg1=20

另外,你可以对 sig.parameters 使用 len 来查看这个函数需要多少个参数:

print(len(params))  # 3

params 的映射中,每一项实际上都是一个 Parameter 对象,它有更多的属性可以帮助你。例如,获取一个参数并查看它的默认值现在可以很简单地做到:

kwarg1 = params['kwarg1']
kwarg1.default # returns: None

其他在 parameters 中的对象也是类似的。


对于使用 Python 2.x 的用户来说,虽然 inspect.getargspec 还没有被淘汰,但这个语言很快就会被淘汰 :-)。在 2.x 版本中没有 Signature 类,也不会有。所以你仍然需要使用 inspect.getargspec

如果你在 Python 2 中的代码依赖于 getargspec 的接口,而切换到 Python 3 的 signature 太困难了,你还有一个很有用的选择,那就是使用 inspect.getfullargspec。它提供了一个类似于 getargspec 的接口(一个可调用的单一参数),用来获取函数的参数,同时处理一些 getargspec 处理不了的额外情况:

from inspect import getfullargspec

def someMethod(self, arg1, kwarg1=None):
    pass

args = getfullargspec(someMethod)

getargspec 一样,getfullargspec 返回一个 NamedTuple,其中包含了参数。

print(args)
FullArgSpec(args=['self', 'arg1', 'kwarg1'], varargs=None, varkw=None, defaults=(None,), kwonlyargs=[], kwonlydefaults=None, annotations={})

撰写回答