您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    Python 为什么要在 18 年前引入布尔类型?且与 C、C++ 和 Java 都不同?
    时间:2020-08-12 21:20 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    本篇文章是我刚翻译的 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)