确定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