确定lambda中的参数个数

我想知道是否有一种方法来确定(给定一个包含lambda的variables)它包含的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) 

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

 >>> 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)。 推荐的解决scheme使用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">)])) 

兰姆达斯像其他任何function。 参数计数存储在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 

从可调用types的文档中,函数的func_code属性包含一个代码对象,而从代码对象的inspect模块文档中,有一个包含参数个数(不包括*** args)的co_argcount成员。

所以从lambda函数(或任何函数)获取这些信息的最好方法是使用func.func_code.co_argcount

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