比较是否真的允许返回数字而不是布尔值,为什么?

Byt*_*ter 3 python types boolean type-conversion truthiness

我在 Python 文档的真值测试下发现了一个令人惊讶的句子:

\n
\n

除非另有说明,具有布尔结果的运算和内置函数始终返回 0 或 False(表示 false)和 1 或 True(表示 true)。

\n
\n

关系运算符似乎没有例外语句,因此 IIUC 它们可以返回0and1而不是某些内置类型(例如 )的值上的Falseand ,甚至是不确定的。True7 < 3

\n

因此,为了满足我的代码生成类型值bool或防御性编程(只要这很重要)的规范要求,我应该将逻辑表达式包装在对 的调用中吗bool

\n

附加问题:为什么会有这个纬度?它是否使 CPython 或其他实现变得更容易?

\n

编辑\n问题已得到解答并且我已接受,但我想在PEP 285 \xe2\x80\x93 添加布尔类型中添加它,我发现了以下语句:

\n
    \n
  1. 所有概念上返回布尔结果的内置操作都将更改为返回 False 或 True,而不是 0 或 1;例如,比较、\xe2\x80\x9cnot\xe2\x80\x9d 运算符以及 isinstance() 等谓词。
  2. \n
  3. 所有定义为返回布尔结果的内置操作都将更改为返回 False 或 True,而不是 0 或 1。特别是,这会影响比较 (<、<=、==、!=、>、>=、 is, is not, in, not in),一元运算符 \xe2\x80\x98not\xe2\x80\x99,内置函数 callable()、hasattr()、isinstance() 和 issubclass(),字典方法 has_key(),字符串和 unicode 方法endswith()、isalnum()、isalpha()、isdigit()、islower()、isspace()、istitle()、isupper() 和startswith(),unicode 方法isdecimal() 和 isnumeric(),以及文件对象的 \xe2\x80\x98\xe2\x80\x99 属性。运算符模块中的谓词也更改为返回布尔值,包括operator.truth()。
  4. \n
  5. 唯一改变的是返回或显式分配时表示真值的首选值。以前,这些首选真值是 0 和 1;现在,这些首选真值是 0 和 1。PEP 将首选值更改为 False 和 True,并更改内置操作以返回这些首选值。
  6. \n
\n

然而,PEP 似乎不如文档(其中语言和库参考是主要部分)权威,并且与 PEP 存在许多偏差(其中许多都明确提到)。因此,我认为,在团队更新之前,PEP 的更强有力的保证是不可信的。

\n

编辑\n我已在 GH 上将其报告为 Python 问题

\n

jua*_*aga 5

因此,理解bool对象就是 int对象可能很重要,因为issubclass(bool, int)这是事实。

\n

事实也是如此isinstance(True, int) and isinstance(False, int)

\n

在 2002 年发布的 2.3 版本之前,Python 缺乏类型boolPEP 285是已接受的提案。在此之前,这些操作将返回01。您可以阅读2.3 的“WhatsNew”

\n
\n

大多数标准库模块和内置函数已\n更改为返回布尔值。

\n
\n

因此,我只能推测该语言被保留下来01而标准库等赶上了这一变化。bool但到目前为止,我认为当返回值是布尔值时,内置函数中的所有内容以及我使用过的标准库的每个部分都会返回。

\n

但请记住,从发行说明来看:

\n
\n

True总而言之,用一句话来说False:它们\xe2\x80\x99是拼写整数值1和的替代方法0,唯一的区别是\nstr()repr()返回字符串\'True\'and\'False\'而不是\'1\'\nand \'0\'

\n
\n