确定lambda中的参数数量

Ant*_*ile 40 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
    """
Run Code Online (Sandbox Code Playgroud)

所以我可以做点什么

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)
Run Code Online (Sandbox Code Playgroud)

Bre*_*arn 55

Lambdas就像其他任何功能一样.参数计数存储在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
Run Code Online (Sandbox Code Playgroud)

  • 但是使用`inspect`可以获得"可移植"功能,看看属性的名称如何从Python 2变为Python 3. (7认同)
  • +1很棒的答案 - 希望我能接受两个答案.这实际上是inspect.py的工作原理(查找源代码). (3认同)

rob*_*ert 41

我正在跳过关于如何计算参数的部分,因为我不知道你想如何考虑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)
Run Code Online (Sandbox Code Playgroud)

听起来像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">)]))
Run Code Online (Sandbox Code Playgroud)

  • 看起来inspect.getargspec已被弃用,建议使用inspect.signature (2认同)

And*_*ark 10

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

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

>>> foo = lambda a, b, *args, **kwargs: None
>>> foo.func_code.co_argcount
2
Run Code Online (Sandbox Code Playgroud)