为什么我们可以将 bool 转换为 str?
Why can we cast bool to str?
我们知道 bool()
如何作用于各种 python 对象,例如 str
、int
、list
。
这是一道反题。
您可以将 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
转换为 str
? list
例如不允许...
>>> 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 中考虑 bool
和 str
的转换是错误的方式。如上所述,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
。
我们知道 bool()
如何作用于各种 python 对象,例如 str
、int
、list
。
这是一道反题。
您可以将 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
转换为 str
? list
例如不允许...
>>> 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 中考虑 bool
和 str
的转换是错误的方式。如上所述,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
。