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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何找到Python函数的参数个数?相关的知识,希望对你有一定的参考价值。

如何找到Python函数的参数个数?我需要知道它有多少正常参数以及有多少命名参数。

例:

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

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

答案

之前接受的答案是deprecatedPython 3.0。你现在应该选择取代它的inspect.getargspec类,而不是使用Signature

通过signature function可以轻松地为函数创建签名:

from inspect import signature

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

sig = signature(someMethod)

现在,您可以通过string快速查看其参数:

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 object,它具有进一步的属性,使您的生活更轻松。例如,现在可以使用以下方法轻松执行抓取参数并查看其默认值:

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

类似于parameters中包含的其他对象。


对于Python 2.x用户,虽然inspect.getargspec不被弃用,但语言很快将成为:-)。 Signature系列中没有2.x类,也不会。所以你仍然需要与inspect.getargspec合作。

至于Python 2和3之间的转换,如果你的代码依赖于Python 2中的getargspec接口并且在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={})
另一答案
import inspect
inspect.getargspec(someMethod)

the inspect module

另一答案
someMethod.func_code.co_argcount

或者,如果当前函数名称未确定:

import sys

sys._getframe().func_code.co_argcount
另一答案

inspect.getargspec()

获取函数参数的名称和默认值。返回四个元组的元组:(args,varargs,varkw,defaults)。 args是参数名称的列表(它可能包含嵌套列表)。 varargs和varkw是*和**参数的名称或None。 defaults是默认参数值的元组,如果没有默认参数,则为None;如果这个元组有n个元素,它们对应于args中列出的最后n个元素。

在2.6版中更改:返回命名元组ArgSpec(args,varargs,keywords,defaults)。

can-you-list-the-keyword-arguments-a-python-function-receives

另一答案

除此之外,我还看到大多数时候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
另一答案

inspect.getargspec()以满足您的需求

from inspect import getargspec

def func(a, b):
    pass
print len(getargspec(func).args)
另一答案

想要在Python 2和Python 3.6+之间以可移植的方式执行此操作的人们的好消息:使用inpsect.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 documentation page

inspect.getfullargspec(FUNC)

版本3.6中已更改:此方法之前已在Python 3.5中被弃用,以支持signature(),但该决定已被颠倒以恢复明确支持的单源Python 2/3代码迁移远离传统getargspec()的标准接口API。

另一答案

正如其他答案所暗示的那样,只要被查询的东西实际上是一个函数,getargspec就能正常工作。它不适用于内置函数,如openlen等,并会在这种情况下抛出异常:

TypeError: <built-in function open> is not a Python function

以下功能(灵感来自this answer)演示了一种解决方法。它返回f预期的args数:

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__字符串中解析函数规范。显然这取决于所述字符串的格式,所以几乎不健壮!

以上是关于如何找到Python函数的参数个数?的主要内容,如果未能解决你的问题,请参考以下文章

Python获取函数参数的个数

Python函数

如何通过代码设置片段标签?

Python获取函数参数个数和默认参数

python如何运行程序并向程序传入参数?

如何在片段列表中找到特定片段?