为什么python禁止使用sum和字符串?

时间:2018-04-03 12:51:32

标签: python string sum

从技术上讲,在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'

0 个答案:

没有答案