如何在lambda中指定参数类型?

25

对于通常的函数,您可以如下注释类型

def my_function(arg1: int)

我该如何在lambda中完成这个操作?

lambda a: int, b: int : a+b

出现语法错误。


如果Python告诉您“'int' object is not subscriptable”,那么这意味着您要求它在一个“int”上调用“[]”。告诉这些对象是列表并不会改变任何东西,因为它们仍然是实际的整数。此外,在Python中指定参数类型只是产生自文档代码的工具,我相信。据我所知,Python解释器在遇到已声明类型的对象时不会有特定的行为。 - Right leg
类型注释不能解决类型错误。 - jonrsharpe
1
@jonrsharpe 伙计,那是一个严厉的编辑。 - Right leg
1
@Rightleg,这是两个完全不同的问题;由于两个问题都有答案,我选择了那个似乎不是其他“如何减少”问题的重复。 - jonrsharpe
1
@jonrsharpe,我们得删除所有与那部分相关的答案。 - Right leg
抱歉提出了不太清晰的问题。 - Rufus
3个回答

39
问题是:“如何在Python lambda中指定参数类型?”尽管其他答案都很好,但它们并没有回答这个主要问题。
答案是:你不能。
函数注释的PEP规范中可以看出:

lambda的语法不支持注释。可以通过在参数列表周围要求括号来更改lambda的语法以支持注释。然而,决定不进行此更改,因为:

它将是一个不兼容的更改。 Lambda已经被削弱了。 Lambda始终可以更改为函数。

供参考:https://dev59.com/XVsX5IYBdhLWcg3wau8r#33833896

0
针对您的问题,让我们看一看reduce的工作原理:
lambda a, b : a[0] + b[0]

在这里,a 是先前迭代的结果,b 是当前元素。

现在,让我们看看你的程序:

functools.reduce(lambda a, b : a[0] + b[0], [[0,1], [2,3]])

细节:

iter #1: a = [0,1], b = [2,3], so, a[0] + b[0] = 0 + 2 =3 

它能够工作。

但是,当你这样做:

functools.reduce(lambda a, b : a[0] + b[0], [[0,1], [2,3], [4,5]]) 

细节:
iter #1: a = [0,1], b = [2,3], so, a[0] + b[0] = 0 + 2 =3 
iter #2: a = 3, b = [4,5], so, a[0] + b[0] = Error, as you can't subscript an integer `3` (3[0] > Error). 

错误重现:
>>> a = 1
>>> a[0]

追踪(Traceback)(最近的调用在最前面): 在第一行中,文件名为空字符串,第一行的错误类型是TypeError。 'int'对象不可分配下标。
您可以通过以下方式获得所需结果:

a = [[0,1], [2,3], [4,5]]
print sum(map(lambda x:x[0],a))

或者,
print sum(i[0] for i in a)

这并没有回答问题。问题是“如何在Python lambda中指定参数类型”,而不是“我该怎么做”。 - Right leg
1
@Rightleg,你现在怎么想?答案已更新。 - Ahsanul Haque
这不是一个糟糕的答案,只是没有回答主要问题。虽然它确实解决了OP的问题,所以我撤回了我的踩。 - Right leg

0
问题在于reduce会计算。
result1 = func(x1, x2)
result2 = func(result1, x3)
...

你的函数接受两个列表并返回一个数字,所以第二次调用函数会失败(除非你只提供两个元素)。
为了能够使用reduce,函数应该接受两个参数并返回与参数相同类型的值,因为函数的输出将被重复使用作为下一次迭代的输入。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接