以编程方式确定函数所需的参数量 - Python

tom*_*dee 31 python parameters function

我正在创建一个简单的命令行实用程序,并使用字典作为一种case语句,其关键字链接到它们的相应函数.这些函数都有不同数量的参数,因此目前检查用户是否输入了每个函数所需的正确数量的参数,我将所需的金额放入表单中的字典case语句中{Keyword:(FunctionName, AmountofArguments)}.

这个当前的设置工作得非常好但是我只是想知道自我改进的利益,如果有一种方法来确定函数中所需的参数数量,我的谷歌尝试返回到目前为止没有任何价值,但我看到args和kwargs因为他们允许的论据数量无限,所以可以搞砸这样的命令.

gim*_*mel 40

inspect.getargspec():

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

  • 更好的是:使用Python 3.3中引入的`Signature`对象.有关文档,请参阅https://docs.python.org/3/library/inspect.html#inspect-signature-object.在处理有界方法对象时,它们会正确地避免计算`self`参数. (4认同)

Ste*_*202 15

你想要的通常是不可能的,因为使用了varargs和kwargs,但是inspect.getargspec(Python 2.x)和inspect.getfullargspec(Python 3.x)接近了.

  • Python 2.x:

    >>> import inspect
    >>> def add(a, b=0):
    ...     return a + b
    ...
    >>> inspect.getargspec(add)
    (['a', 'b'], None, None, (0,))
    >>> len(inspect.getargspec(add)[0])
    2
    
    Run Code Online (Sandbox Code Playgroud)
  • Python 3.x:

    >>> import inspect
    >>> def add(a, b=0):
    ...     return a + b
    ...
    >>> inspect.getfullargspec(add)
    FullArgSpec(args=['a', 'b'], varargs=None, varkw=None, defaults=(0,), kwonlyargs=[], kwonlydefaults=None, annotations={})
    >>> len(inspect.getfullargspec(add).args)
    2
    
    Run Code Online (Sandbox Code Playgroud)

  • `inspect.getargspec(function)`是一个命名元组,所以你可以使用更可读的`len(inspect.getargspec(function).args)`而不是`len(inspect.getargspec(function)[0])`. (3认同)