从技术上讲,在Python中,可以预期实现__add__
方法的任何内容都应该能够使用sum
函数。
字符串__add__
实现为连接:
"abc "+"def"
> 'abc def'
sum
将起始值作为第二个参数,默认情况下为 int 0
,如下所示:
sum([])
0
sum([], 7)
7
这就是为什么执行sum(["abc", "def"])
不起作用,因为它会尝试将0
添加到“abc”:
sum(["abc", "def"])
TypeError:+:'int'和'str'
的不支持的操作数类型
但是给一个字符串作为sum
的起始值,它应该有效。但它不起作用,因为在sum
的实现中,有一个临时检查,以查看起始值是否为字符串(或其他不需要的类型),如果起始值为起始值,则会引发类型错误一个字符串:
sum(["sf", "34", "342"], "")
TypeError:sum()不能对字符串求和[使用''.join(seq)代替]
为什么Python在sum
中遇到某些类型的手工制作异常的麻烦?更简单,更pythonic的方式是总和与任何具有__add__
的实现,没有?
可以看到,如果没有这个检查,sum
将通过定义一个“零”类来处理字符串,当添加到任何东西时返回另一个东西。如果我们使用它作为起始元素,那么它会绕过检查(因为它不是字符串)并且sum可以用来添加字符串:
sum(["a", "b", "c"], type("_", (), {"__add__": lambda _, o: o})())
'ABC'