我想知道是否有办法确定(给定一个包含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)
答案 0 :(得分:53)
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 :(得分:40)
我正在跳过关于如何计算参数的部分,因为我不知道你想如何考虑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)
从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">)]))
答案 2 :(得分:10)
从callable types上的文档中,函数的func_code
属性包含一个代码对象,并且code objects上的inspect模块文档中包含一个co_argcount
成员参数的数量(不包括*
或**
args)。
因此,从lambda函数(或任何函数)获取此信息的最佳方法是使用func.func_code.co_argcount
:
>>> foo = lambda a, b, *args, **kwargs: None
>>> foo.func_code.co_argcount
2