为什么bool是Python 3中int的子类?

时间:2018-01-17 20:32:55

标签: python python-3.x boolean

bool引入以来,它一直是int的子类,并且bools可以隐式地“转换”为整数:

>>> issubclass(bool, int)
True
>>> ['one', 'two'][False]
'one'
>>> ['one', 'two'][True]
'two'
>>> True/20
0.05

这是出于历史原因:与2.3之前的API的兼容性;我明白它保持在2.3到2.7之间。 (这在2011年的this question中得到了解决)

然而,为什么它仍然适用于Python 3?我认为没有任何优势。并且没有理由为了向后兼容而保持这一点:Python 3.0是一个突破性版本;而且我也不认为任何2.3之前的API仍然存在。

2 个答案:

答案 0 :(得分:7)

来自original bool PEP

  

我们是否应该努力消除对bool的非布尔运算   未来,通过适当的警告,以便例如True + 1   最终(在Python 3000中)是非法的?

     

=>否。

     

有一个小但有声音的少数人喜欢看“教科书”   根本不支持算术运算的bool,但大多数   评论家同意我的看法,bools应该总是允许算术   操作

后来在同一份文件中:

  

由于向后兼容性,bool类型缺少很多   有些人希望看到的属性。例如,算术   允许使用一个或两个bool参数的操作,处理False   为0,True为1.另外,bool可以用作序列索引。

     

我不认为这是一个问题,我不想进化语言   这方向也是。我不相信更严格的解释   “Booleanness”使语言更清晰。

删除bools-as-numbers不是预期的语言方向。 Guido认为它不会让语言更好。

答案 1 :(得分:1)

有用性示例:两个布尔值0,False和1,True可以表示任何二进制分区的2个部分。假设n个人回答了m个问题,并且他们对每个问题的回答被标记为' fail'或者通过'。我们创建一个数据表,其中包含n行和m(+1,用于id)列,代码失败/传递为0/1。然后我们可以通过对每个问题的行和每个问题的求和进行求和来计算每个问题的过程。任何体面的分析软件都应该能够做很少或没有自定义编程。

Python 3开发:我参与了讨论,并确信有更多兼容性破坏提案被拒绝而不是被接受。每次改变都要付出代价。