问题:如何找到Python函数的参数数量?
如何找到Python函数的参数数量?我需要知道它有多少个普通参数以及多少个命名参数。
例:
def someMethod(self, arg1, kwarg1=None):
pass
此方法有2个参数和1个命名参数。
回答 0
早于接受的答案已于弃用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
此外,你可以叫len
上sig.parameters
也看到的参数此功能,需要数量:
print(len(params)) # 3
params
映射中的每个条目实际上都是一个具有更多属性的Parameter
对象,使您的生活更加轻松。例如,现在可以轻松地执行以下操作来获取参数并查看其默认值:
kwarg1 = params['kwarg1']
kwarg1.default # returns: None
包含在中的其余对象也类似parameters
。
对于Python 2.x
用户,虽然inspect.getargspec
不建议弃用,但该语言很快就会成为:-)。该Signature
类在该2.x
系列中不可用,也不会提供。因此,您仍然需要使用inspect.getargspec
。
至于Python 2和3之间的转换,如果你有一些代码依赖的接口getargspec
在Python 2切换到signature
在3
是太难了,你必须将有价值的选择使用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={})
回答 1
import inspect
inspect.getargspec(someMethod)
参见检查模块
回答 2
someMethod.func_code.co_argcount
或者,如果当前函数名称不确定,请执行以下操作:
import sys
sys._getframe().func_code.co_argcount
回答 3
获取函数参数的名称和默认值。返回包含四个内容的元组:(args,varargs,varkw,默认值)。args是参数名称的列表(它可能包含嵌套列表)。varargs和varkw是*和**参数的名称或无。defaults是默认参数值的元组;如果没有默认参数,则为None;如果该元组具有n个元素,则它们对应于args中列出的最后n个元素。
在2.6版中进行了更改:返回一个命名的元组ArgSpec(args,varargs,关键字,默认值)。
回答 4
除此之外,我还看到大多数时候help()函数确实可以帮助您
例如,它提供了有关所采用参数的所有详细信息。
help(<method>)
给出以下
method(self, **kwargs) method of apiclient.discovery.Resource instance
Retrieves a report which is a collection of properties / statistics for a specific customer.
Args:
date: string, Represents the date in yyyy-mm-dd format for which the data is to be fetched. (required)
pageToken: string, Token to specify next page.
parameters: string, Represents the application name, parameter name pairs to fetch in csv as app_name1:param_name1, app_name2:param_name2.
Returns:
An object of the form:
{ # JSON template for a collection of usage reports.
"nextPageToken": "A String", # Token for retrieving the next page
"kind": "admin#reports#usageReports", # Th
回答 5
对于想要以可移植的方式在Python 2和Python 3.6+之间进行此操作的人们来说是个好消息:use inspect.getfullargspec()
方法。它可以在Python 2.x和3.6+中使用
正如Jim Fasarakis Hilliard和其他人指出的那样,它以前是这样的:
1.在Python 2.x中:使用inspect.getargspec()
2.在Python 3.x中:使用签名,因为getargspec()
和getfullargspec()
已弃用。
但是,从Python 3.6开始(受大众欢迎?),情况已经朝着更好的方向发展:
从Python 3 文档页面:
inspect.getfullargspec(func)
在版本3.6中进行了更改:以前
signature()
在Python 3.5中记录了此方法的不推荐使用,但是为了恢复从原始getargspec()
API 迁移来的单一源Python 2/3代码的明确支持的标准接口,该决定已被撤销。
回答 6
inspect.getargspec()满足您的需求
from inspect import getargspec
def func(a, b):
pass
print len(getargspec(func).args)
回答 7
正如其他答案所暗示的,getargspec
只要被查询的东西实际上是一个功能,它就可以很好地工作。它不适用于,等内置函数open
,len
在以下情况下将引发异常:
TypeError: <built-in function open> is not a Python function
以下功能(受此答案启发)展示了一种解决方法。它返回预期的args数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__
字符串中解析出函数规范。显然,这依赖于所述字符串的格式,因此很难实现!
回答 8
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
回答 9
在:
import inspect
class X:
def xyz(self, a, b, c):
return
print(len(inspect.getfullargspec(X.xyz).args))
出:
4
注意:如果xyz不在X类之内,并且没有“自我”,而只有“ a,b,c”,那么它将打印3。
对于3.5以下的python,您可能需要在上面的代码中替换inspect.getfullargspec
为inspect.getargspec
。