确定lambda中的参数数量

时间:2012-06-02 19:33:53

标签: python lambda

我想知道是否有办法确定(给定一个包含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)

3 个答案:

答案 0 :(得分:53)

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

答案 1 :(得分:40)

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

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

从Python 3开始听起来像inspect.getargspec is deprecated(感谢@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">)]))

答案 2 :(得分:10)

callable types上的文档中,函数的func_code属性包含一个代码对象,并且code objects上的inspect模块文档中包含一个co_argcount成员参数的数量(不包括*** args)。

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

>>> foo = lambda a, b, *args, **kwargs: None
>>> foo.func_code.co_argcount
2