45

我想知道是否有办法确定(给定一个包含 lambda 的变量)它包含的 lambda 参数的数量。原因是,我希望根据参数的数量有条件地调用一个函数。

我在寻找什么

def magic_lambda_parameter_counting_function(lambda_function):
    """Returns the number of parameters in lambda_function

    Args:
        lambda_function - A lambda of unknown number of parameters
    """

所以我可以做类似的事情

def my_method(lambda_function):

    # ... 
    # (say I have variables i and element)

    parameter_count = magic_lambda_parameter_counting_function(lambda_function)

    if parameter_count == 1:
        lambda_function(i)
    elif parameter_count == 2:
        lambda_function(i, element)
4

3 回答 3

60

Lambda 和其他函数一样。参数计数存储在func.__code__.co_argcount.

>>> foo = lambda x, y=2: x+y
>>> foo.__code__.co_argcount
2
>>> foo = lambda x, y=2, z=3: x+y+z
>>> foo.__code__.co_argcount
3
于 2012-06-02T19:37:46.783 回答
45

我跳过了关于如何计算参数的部分,因为我不知道你想如何考虑可变参数和关键字。但这应该让你开始。

>>> import inspect
>>> foo = lambda x, y, z: x + y + z
>>> inspect.getargspec(foo)
ArgSpec(args=['x', 'y', 'z'], varargs=None, keywords=None, defaults=None)

听起来inspect.getargspec 自 Python 3 起已被弃用(感谢@JeffHeaton)。推荐的解决方案使用inspect.signature。结果的.parameters成员包含各种结构,具体取决于所讨论函数的参数排列,但我正在匹配上面 Python 2 示例中的函数。

>>> import inspect
>>> foo = lambda x, y, z: x + y + z
>>> inspect.signature(foo).parameters
mappingproxy(OrderedDict([('x', <Parameter "x">), ('y', <Parameter "y">), ('z', <Parameter "z">)]))
于 2012-06-02T19:37:18.887 回答
10

可调用类型的文档中,函数的func_code属性包含一个代码对象,并且从代码对象的检查模块文档中,一个co_argcount包含参数数量的成员(不包括***args)。

因此,从 lambda 函数(或任何函数)获取此信息的最佳方法是使用func.func_code.co_argcount

>>> foo = lambda a, b, *args, **kwargs: None
>>> foo.func_code.co_argcount
2
于 2012-06-02T19:46:19.453 回答