本篇文章是我刚翻译的 PEP-285,作者是 Python 之父 Guido van Rossum。这个 PEP 意义十分严重,Python 的 bool 类型就是从它末尾引入的,而我在上篇文章中剖析到的很多成绩,都能在这篇十几年前的文档中找到解释!另外它还回应了比较典型的一些争议,值得大家了解下。
PEP原文 : https://www.python.org/dev/peps/pep-0285
PEP标题: PEP 285 -- Adding a bool type
PEP作者:Guido van Rossum
创立日期:2002-03-08
合入版本:2.3译者: 豌豆花下猫@Python猫群众号
PEP翻译方案: https://github.com/chinesehuazhou/peps-cn
概要本 PEP 提议引入一个新的内置类型 bool ,它将包含两个常量 False 和 True 。这个 bool 类型是 int 类型的直接子类型(在 C 中),并且在除了 repr() 和 str() 之外的大少数方面,它的值 False 和 True 都将表现得像是 0 和 1(例如,False == 0 和 True == 1 都为真)。
一切在概念上需前往布尔结果的内置操作,都将更改为前往 False 或 True,而不再是 0 或 1,例如,比较操作、“not”运算和 isinstance() 之类的断言办法。
评审我曾经搜集了太多太多的反应意见,因此我宣布:评审阶段(review period)正式 完毕。 我明天吃的是中国菜,我的签语饼上写着:“Strong and bitter words indicate a weak cause.” 它使我想起了一些支持本 PEP 的帖子... :-)
(译注:1、签语饼即 fortune cookies,这是一种美国文明特征。美国的中餐馆在结账的时分盛行给主人一些写了签语的饼干,普通都是祝愿语。2、那句签语出自维克多·雨果,意为:理亏者言辞剧烈)
无论如何,这些是我的 BDFL 声明。(执行摘要(Executive summary):我不会更改任何内容;一切其它提议都会被拒绝。)
1、本 PEP 应该被接受吗?=>是的。
有很多支持本 PEP 的观念。其中少数是出于曲解。我已尝试在下面的 PEP 注释中廓清一些最常见的曲解。对我而言独一值得思索的成绩是新手们倾向于写“ if x == True”,但“if x”就足够了。下面也有更多关于它的信息。我以为这不足以拒绝本 PEP。
2、 str(True) 应该前往“True”还是“1”?“1”能够会增加向后兼容性成绩,但看起来很奇异。( repr(True) 将一直前往“True”。)=>“True”。
简直一切评审人都赞同这一点。
3、常量应该被命名为“True”和“False”(相似于 None)还是“true”和“false”(像 C++、Java 和 C99 那样)?=>True 和 False。
大少数评审人都以为 Python 内的分歧性要比跟其它言语的分歧性更为重要。
4、能否应该经过适当的告警来消弭对布尔值的非布尔运算,以便例如 True + 1 最终(在 Python 3000 中)变为合法的?=>不该
有一小部分观念响亮的人,希望看到“教科书式”的布尔类型,即完全不支持算术运算,但大少数评审人都赞同我,以为布尔类型应该支持算术运算。
5、 operator.truth(x) 应该前往 int 还是 bool?=>bool。
Tim Peters 以为应该前往一个整数,但是简直一切其他评审人都以为应该前往一个布尔值。我的理由:operator.truth() 意味着强迫其参数运用布尔类型上下文(它调用 C API PyObject_IsTrue() )。无论结果是 int 还是 bool,都是主要的;假设有 bool,则没有理由不运用它。(在本 PEP 下,operator.truth() 成为了 bool() 的别名;这也可以。)
6、bool 应该承袭自 int 吗?=>是的。
在理想的状况下,bool 最好是完成为一种独自的整数类型,且支持执行混合的算术操作。但是,从 int 承袭出 bool 将极大地简化完成(部分缘由是,一切调用 PyInt_Check() 的 C 代码都可兼容——它关于 int 的子类会前往 true)。
另外,我以为这契合可交流性(substitutability)概念:代码中需求 int 时,可以喂入 bool,它同等于 0 或 1。代码中需求 bool 时,若赋予 int,则能够不契合预期;例如,3&4 计算为 0,但是当 3 和 4 被视为真值时,却都为真。
7、能否应该改动“bool”的叫法?=>不。
一些评审人主张运用 boolean 而不是 bool,由于这样更容易了解(新手能够听说过布尔代数(Boolean algebra),但能够对 bool 无感),或许由于他们厌恶缩写。
我的观念:Python 明智地运用缩写(例如'def'、'int'、'dict'),我不以为这会形成了解的担负。关于新手来说,无论它被叫作 waffle 还是 bool 都没关系;这只是一个新词,他们很快就能掌握它的含义。
(译注:waffle,我们普通熟知的意思是“华夫饼干”,但它还有个意思是“有意义的、有关紧要的、胡乱的话”)
一位评审人以为可以叫“truth”。我觉得这个叫法没有吸引力,实践上更倾向于保留该术语(在文档中),以指代在 Python 中曾经存在的详细的真值概念。例如:“当将一个容器解释为一个 truth 值时,空容器会被视为假,而非空容器则被视为真”。
8、未来能否应该要求布尔运算符(例如“if”、“and”和“not”)运用一个布尔值作为参数,例如令“if []:”变为合法的,要求必须写成“ if bool([]):” ???=>不!!!
有些人以为,这就是一门有教科书式布尔类型的言语应该的做法。由于它被提起了,所以其别人担忧我能够会赞同这一做法。
我来明白阐述对此的立场:这不是本 PEP 的动机,我也有意停止更改。(另请参见下面的“廓清”部分。)
基本原理大少数言语最终都会开展出一个布尔类型,甚至 C99(新的改良版 C 标准,尚未普遍采用)也有一个。 (译注:C99 标准降生于 1999 年,本 PEP 写于 2002 年,时过境迁,如今 C99 标准基本上已是落伍的了)
许多顺序员都觉得需求一种布尔类型,大少数 Python 文档因缺少布尔类型而含有歉意。我看过很多模块,它们在顶部定义了常量“False = 0”和“True = 1”(或相似的常量),并运用它们。
(责任编辑:admin)