确定的λ参数数量(Determining the number of parameters in a

2019-07-29 16:56发布

我想知道如果有一种方法来确定(给出含有的λ可变)的参数的数量它包含的拉姆达。 是的原因,我想调用一个函数有条件地依赖于参数的数量。

我正在寻找

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)

Answer 1:

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

>>> 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">)]))


Answer 2:

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


Answer 3:

从上的文档可调用类型 ,所述func_code的功能属性包含一个代码对象,并从在检查模块文档代码对象有一个co_argcount包含的参数(不包括编号构件***参数)。

所以最好的方式来获得一个lambda函数(或任何功能),这些信息是使用func.func_code.co_argcount

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


文章来源: Determining the number of parameters in a lambda
标签: python lambda