为什么我们可以将 bool 转换为 str?

Why can we cast bool to str?

我们知道 bool() 如何作用于各种 python 对象,例如 strintlist

这是一道反题。

您可以将 bool 转换为 int 为

>>> int(True)
1
>>> int(False)
0

我认为这有点道理,但是对于字符串我们得到

>>> str(False)
'False'
>>> str(True)
'True'

我不明白,因为首先它似乎暗示了 False'False' 之间的某种关系,这似乎只在代码级别相关。如果写在代码中的东西要这样处理,这是怎么操作的...

>>> str(not True)
'False'

其次,不明显是为了保持一致性,因为

>>> bool(str(False))
True

我的问题是...是否有理由允许我们以这种方式将 bool 转换为 strlist 例如不允许...

>>> list()
[]
>>> bool()
False
>>> bool(list())
False
>>> list(bool())
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'bool' object is not iterable

嗯,str(True) 变成 'True' 有什么问题?这完全符合预期。

现在,如果将布尔值转换为整数,很明显结果必须是数字。

当然,not True 的计算结果为 False。即str(False),则:'False'.

关于 bool() 函数,对于非空、零、None 或 False 的任何内容,它应该 return True

所以任何不是 '' 的字符串都适合这个和 returns True。查看更多:https://docs.python.org/3/library/stdtypes.html#truth

用于调试。如果你不能将一个东西转换成一个字符串,你就不能打印它。如果要打印数据结构以进行调试,则需要能够将每个元素转换为字符串。 That's what str is documented to do...

Return a string containing a nicely printable representation of an object.


If what is written in code is to be treated this way, how does this work ...

>>> str(not True)
'False'

not True 解析为 False,然后传递给 str。它类似于 foo(1 + 1) foo 接收 2.

的方式

Second, it's not obvious it's for consistency, as

>>> bool(str(False))
True

不保证投射是往返的。例如 int(float(2.34))int(unichr(97)).

将某些东西转换为供人类使用的字符串(这是 str 所做的)与将某些东西转换为供 marshalling which must round trip. There are specialized packages like marshal or json 编组的字符串之间存在重要区别。

但是在 Python 中考虑 boolstr 的转换是错误的方式。如上所述,str returns 是一种可打印的表示形式,而不是机器可读的表示形式。 bool 用于询问“这个表达式的真实性是什么”? From the docs...

x is converted using the standard truth testing procedure.

"True""False" 都是正确的。如果他们只为 bool 添加一个特例,那将是非常不一致的。

str()bool() 不是 "casts",它们是构造函数(类型对象)。为任何值 x 调用 str(x) 将构造一个新的 str 对象,其值(以某种方式)从 x 初始化。两个对象之间没有隐含的关系; str(x) 可以 return 任何东西,只要它是 str 对象。

基本上:停止认为 Python 与您可能习惯的其他语言一样具有 "casts"。构造函数只是另一种可调用对象,一般规则是每种类型都对传递给构造函数的参数做一些合理的事情。在 str() 的情况下,它委托给 __str__ 特殊方法(如果存在),这意味着 bool 对象 return 字符串 'True''False' 因为那是 bool 类型决定要做的事情。

在 Python 中 False 考虑的事情非常有限:

  • None
  • 任何数字类型的零,例如 0、0L、0.0、0j。
  • 任何空序列,例如,'', (), [].
  • 任何空映射,例如 {}。
  • 用户定义的 classes 的实例,如果 class 定义了一个 nonzero() 或 len() 方法,当该方法 returns 整数零或布尔值 False

因此,如果您执行 bool(something),这些项目只会 return False。 Python 中的所有其他内容都是 True,包括虚假事物的字符串表示:'0' 'False''None' 等,因为字符串本身是 True