我如何才能找到一个Python函数的参数的数量?我需要知道它有多少普通参数和多少命名参数。
例子:
def someMethod(self, arg1, kwarg1=None):
pass
这个方法有2个参数和1个命名参数。
我如何才能找到一个Python函数的参数的数量?我需要知道它有多少普通参数和多少命名参数。
例子:
def someMethod(self, arg1, kwarg1=None):
pass
这个方法有2个参数和1个命名参数。
当前回答
正如其他答案所暗示的那样,只要查询的东西实际上是一个函数,getargespec就能很好地工作。它不适用于内置函数,如open, len等,并会在这些情况下抛出异常:
TypeError: <built-in function open> is not a Python function
下面的函数(受到这个答案的启发)演示了一种变通方法。它返回f期望的参数数:
from inspect import isfunction, getargspec
def num_args(f):
if isfunction(f):
return len(getargspec(f).args)
else:
spec = f.__doc__.split('\n')[0]
args = spec[spec.find('(')+1:spec.find(')')]
return args.count(',')+1 if args else 0
其思想是从__doc__字符串中解析出函数规范。显然,这依赖于所述字符串的格式,因此几乎不是健壮的!
其他回答
Dimitris Fasarakis Hilliard的公认答案建议以字符串格式获取参数,但我认为在解析这个字符串时可能会犯错误,因此我直接使用inspect模块创建了一个参数列表
import inspect
def my_function(a,b,c):
#some code
pass
result=list(inspect.signature(my_function).parameters.keys())
print(result)
['a','b','c']
func.__code__。co_argcount给出了在*args之前任何参数的个数
函数。__kwdefaults__给你一个字典的关键字参数AFTER *args
func.__code__。Co_kwonlyargcount等于len(funct .__kwdefaults__)
函数。__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
Inspect.getargspec()来满足您的需求
from inspect import getargspec
def func(a, b):
pass
print len(getargspec(func).args)
In:
import inspect
class X:
def xyz(self, a, b, c):
return
print(len(inspect.getfullargspec(X.xyz).args))
Out:
4
注意:如果xyz不在类X中,并且没有“self”,只有“a, b, c”,那么它将打印3。
对于3.5以下的python,您可能需要替换inspect。通过检查获得全部规格。在上面的代码中获取目标规格。
假设您可能正在处理基于类的方法或简单的函数,您可以像下面这样做。
如果输入是类方法(因此包括self),这将自动减去一个输入。
import types
def get_arg_count(fn):
extra_method_input_count=1 if isinstance(fn, types.MethodType) else 0
return fn.__code__.co_argcount-extra_method_input_count
然后你可以根据需要应用到函数或方法:
def fn1(a, b, c):
return None
class cl1:
def fn2(self, a, b, c):
return None
print(get_arg_count(fn1)) #=> 3
print(get_arg_count(cl1().fn2)) #=> 3