如何找到Python函数的参数个数?
我怎么才能找到一个Python函数的参数数量呢?我需要知道它有多少个普通参数和多少个命名参数。
举个例子:
def someMethod(self, arg1, kwarg1=None):
pass
这个方法有2个参数和1个命名参数。
14 个回答
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
import inspect
inspect.getargspec(someMethod)
请查看 inspect模块
之前被接受的答案在 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={})