【问题标题】:Determining the number of parameters in a lambda确定 lambda 中的参数数量
【发布时间】:2012-06-02 19:33:53
【问题描述】:

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

【问题讨论】:

    标签: python lambda


    【解决方案1】:

    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 好答案——希望我能接受两个答案。事实上,inspect.py 就是这样做的(查找源代码)。
    • 但是使用inspect,您可以获得“可移植”功能,查看属性名称如何从 Python 2 更改为 Python 3。
    • 这个答案很棒,因为与需要加载模块的检查方法相比,它的计算量几乎为零。
    【解决方案2】:

    我将跳过有关如何计算参数的部分,因为我不知道您想如何考虑可变参数和关键字。但这应该可以帮助您入门。

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

    【讨论】:

    • 看起来inspect.getargspec已被弃用,建议使用inspect.signature
    【解决方案3】:

    callable types 的文档中,函数的func_code 属性包含一个代码对象,从code objects 的检查模块文档中,有一个co_argcount 成员包含参数的数量(不包括@ 987654325@ 或 ** args)。

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

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

    【讨论】:

      猜你喜欢
      • 2014-06-30
      • 1970-01-01
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多