我如何才能找到一个Python函数的参数的数量?我需要知道它有多少普通参数和多少命名参数。

例子:

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

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


当前回答

这是获取函数的强制参数数量的解决方案(*)

如果使用了一些不常见的参数规范(具有默认值的仅限位置参数,没有默认值的仅限关键字参数,等等),那么本文提出的许多解决方案都无法实现这一目的。

from typing import Callable, Any
import inspect

def get_mandatory_argcount(f: Callable[..., Any]) -> int:
    """Get the number of mandatory arguments of a function."""
    sig = inspect.signature(f)
    
    def parameter_is_mandatory(p: inspect.Parameter) -> bool:
        return p.default is inspect.Parameter.empty and p.kind not in (
            inspect.Parameter.VAR_POSITIONAL,
            inspect.Parameter.VAR_KEYWORD,
        )
    
    return sum(parameter_is_mandatory(p) for p in sig.parameters.values())

# mandatory keyword-only
def f1(b=2, *args, c, d=1, **kwds): pass
print(get_mandatory_argcount(f1))

# positional only with default
def f2(a=1, /, b=3, *args, **kwargs): pass
print(get_mandatory_argcount(f2))

(*)我想把这个作为一个答案,以编程方式确定一个函数所需的参数数量- Python代替,但由于某种原因,这个问题被标记为重复的这个问题,尽管它专门询问所需参数的数量,而这个问题只询问参数的一般数量。

其他回答

假设您可能正在处理基于类的方法或简单的函数,您可以像下面这样做。

如果输入是类方法(因此包括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
import inspect
inspect.getargspec(someMethod)

查看inspect模块

inspect.getargspec ()

Get the names and default values of a function’s arguments. A tuple of four things is returned: (args, varargs, varkw, defaults). args is a list of the argument names (it may contain nested lists). varargs and varkw are the names of the * and ** arguments or None. defaults is a tuple of default argument values or None if there are no default arguments; if this tuple has n elements, they correspond to the last n elements listed in args. Changed in version 2.6: Returns a named tuple ArgSpec(args, varargs, keywords, defaults).

看到can-you-list-the-keyword-arguments-a-python-function-receives。

someMethod.func_code.co_argcount

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

import sys

sys._getframe().func_code.co_argcount

这是获取函数的强制参数数量的解决方案(*)

如果使用了一些不常见的参数规范(具有默认值的仅限位置参数,没有默认值的仅限关键字参数,等等),那么本文提出的许多解决方案都无法实现这一目的。

from typing import Callable, Any
import inspect

def get_mandatory_argcount(f: Callable[..., Any]) -> int:
    """Get the number of mandatory arguments of a function."""
    sig = inspect.signature(f)
    
    def parameter_is_mandatory(p: inspect.Parameter) -> bool:
        return p.default is inspect.Parameter.empty and p.kind not in (
            inspect.Parameter.VAR_POSITIONAL,
            inspect.Parameter.VAR_KEYWORD,
        )
    
    return sum(parameter_is_mandatory(p) for p in sig.parameters.values())

# mandatory keyword-only
def f1(b=2, *args, c, d=1, **kwds): pass
print(get_mandatory_argcount(f1))

# positional only with default
def f2(a=1, /, b=3, *args, **kwargs): pass
print(get_mandatory_argcount(f2))

(*)我想把这个作为一个答案,以编程方式确定一个函数所需的参数数量- Python代替,但由于某种原因,这个问题被标记为重复的这个问题,尽管它专门询问所需参数的数量,而这个问题只询问参数的一般数量。