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

Val*_*ntz 2 python boolean python-3.x

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

>>> issubclass(bool, int)
True
>>> ['one', 'two'][False]
'one'
>>> ['one', 'two'][True]
'two'
>>> True/20
0.05
Run Code Online (Sandbox Code Playgroud)

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

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

use*_*ica 8

最初的bool PEP:

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

=>不.

有一个小但有声音的少数人更愿意看到根本不支持算术运算的"教科书"bool,但大多数评论家都认同bool应该总是允许算术运算.

后来在同一份文件中:

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

我不认为这是一个问题,我也不想在这个方向上进化语言.我不相信对"布尔性"的更严格解释会使语言更清晰.

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