成绩是每团体的做法都不一样。例如,你应该运用“FALSE”、“false”、“False”、“F”还是“f”呢?另外,假值应该为 0 或 None,或是一个其它的布尔类型打印出“true”或“false”呢?在言语中添加一个标准的布尔类型可以处置这些成绩。
一些外部库(例如数据库和 RPC 相关的包)需求可以区散布尔值和整数值,虽然通常可以制定出处置方案,但假设言语本身提供了标准的布尔类型,则会更容易。这也适用于 Jython:某些 Java 类具有辨别用于 int 和 boolean 参数的重载办法或结构函数。布尔类型可用于选择布尔变量。(显然,某些 COM 接口也是如此。)
标准的布尔类型(bool type)也可以作为强迫将值解释为布尔值(Boolean)的办法,该办法可用于标准化布尔值。当一个布尔值需求归一化为两个值之一时,bool(x) 比“not not x”更明晰,也比这种写法更繁复:
if x:
return 1
else:
return 0
这是从教授 Python 中得出的一些阅历。当向人们在交互式终端中展现比较运算符时,我以为这有点美观:
>>> a = 13
>>> b = 12
>>> a > b
1
>>>
假设是这样的话:
>>> a > b
True
>>>
每次会少花一毫秒的时间思索打印出的 0 或 1。
还有一个成绩(它甚至困扰了曾经阅历丰厚但远离了 Python 一段时间的人):
>>> cmp(a, b)
1
>>> cmp(a, a)
0
>>>
你能够会倾向于以为 cmp() 也前往一个布尔值,但实践上它可以前往三个不同的值(-1、0、1)。假设整数没有(通常)被用于表示布尔值结果,则这可以愈加清楚地表达出其它的含义。(译注:即只用 True/False 表示布尔值,则整数表达其它含义时就不会有歧义)
标准以下 Python 代码详细罗列了新类型的大少数属性:
class bool(int):
def __new__(cls, val=0):
# This constructor always returns an existing instance
if val:
return True
else:
return False
def __repr__(self):
if self:
return "True"
else:
return "False"
__str__ = __repr__
def __and__(self, other):
if isinstance(other, bool):
return bool(int(self) & int(other))
else:
return int.__and__(self, other)
__rand__ = __and__
def __or__(self, other):
if isinstance(other, bool):
return bool(int(self) | int(other))
else:
return int.__or__(self, other)
__ror__ = __or__
def __xor__(self, other):
if isinstance(other, bool):
return bool(int(self) ^ int(other))
else:
return int.__xor__(self, other)
__rxor__ = __xor__
# Bootstrap truth values through sheer willpower
False = int.__new__(bool, 0)
True = int.__new__(bool, 1)
False 和 True 将是单例的(singletons),像 None 一样。由于这种类型有两个值,也许应该将它们称为“doubletons”?实践的完成将不允许创立 bool 的其它实例。
True 与 False 会被正确地序列化和打包,例如 pickle.loads(pickle.dumps(True)) 将前往 True, 而marshal.loads(marshal.dumps(True)) 也一样。
一切在定义上需前往布尔结果的内置操作,都将更改为前往 False 或 True,而不再是 0 或 1。
(责任编辑:admin)