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