小编典典

为什么print语句不是pythonic?

python

这个问题困扰了我很长时间正如我之前的问题:为什么print(x)比(确切地说是更pythonic的)更好print x

对于那些不知道的人,该print语句已更改为Python 3.0中的函数。正式文档在PEP
3105中
,动机在Guido van
Rossum的电子邮件中

对于这些问题,我想提出一个反对意见:

  1. 还有其他运算符,例如import我们写为语句的运算符,尽管它们的功能实际上与某个功能重复__import__
    • 对于初学者来说,运算符print不属于一般的应用程序逻辑。对他们来说,神秘的运算符是他们程序的顶峰。他们希望它看起来有所不同。
    • 现在 保证 所有描述基本Python 2.x的初学者书籍都 与第一个示例无关 。当然,语言有时会发生变化,但是对于新手来说,这些变化通常较不明显。
    • 对我而言,立即print可以在应用程序级别上复制功能并不是很明显。例如,有时我想从控制台将打印重定向为模式OS对话框。
    • 人们说很难将所有print语句重写为一个函数,但他们已迫使每个Python 2.x开发人员为所有项目完全做到这一点。很好,使用自动转换器并不难。
    • print如果print拥有语句包装功能,那么喜欢操纵功能的每个人都会得到同样的服务__print__

那么,我们能否在Stack Overflow页面上对这个问题有一个规范的答案?


阅读 232

收藏
2021-01-20

共1个答案

小编典典

在我看来,您的辩论是一场辩论,而不是一个问题,您是否真的要接受一个答案,表明您在主张中的错误和严重程度?

关于您的辩论要点:

还有其他运算符,例如import,我们将其作为语句编写,尽管它们的功能实际上与某个函数重复 __import__

绝对错误:函数__import__(如 每隔 其他功能-和运营商,为此事)结合 没有 在“来电者”的范围的名称(含其代码)
-任何“的thingie”结合的名字在“来电者的范围” 必须
是一条语句(就像赋值def,和一样call)。您的“观点”似乎完全错过了Python在语句和表达式之间绘制的极其深刻而关键的区别-人们可能会
不喜欢 这种区别,但是 忽略 它是最明显的错误。

Python语句是Python编译器必须特别意识到的事情-
它们可能会更改名称的绑定,可能会更改控制流,并且/或者在某些情况下可能需要从生成的字节码中完全删除(后者适用于assert)。print是Python
2中此断言的 唯一 例外;通过从语句表中删除它,Python 3删除了一个异常,使一般的断言“成立”,因此是一种更常规的语言。
特殊情况还不足以打破规则 ,长期以来一直是Pythonic的宗旨(import this在交互式解释器的>>> 提示以查看显示的“
Python的禅”),并且对语言的这种更改消除了由于早期,错误的设计决定而不得不保留多年的这一原则。

对于初学者来说,操作员打印不属于常规应用程序逻辑。对他们来说,神秘的运算符是他们程序的顶峰。他们希望它看起来有所不同。

尽早治愈初学者的误解是一件好事。

现在保证所有描述基本Python 2.x的初学者书都脱离了第一个例子。当然,语言有时会更改,但是对于新手来说,更改通常较不明显。

语言很少以深度和向后不兼容的方式进行更改(Python大约每十年进行一次),并且很少有语言功能“对于新手来说是高度可见的”,因此观察的总数很小,但是即使在这个很小的指南针中,我们也可以轻松地实现查找反例,对于初学者来说,高可见度的功能设计得很糟糕,以至于删除它是值得的。例如,现代的Basic语言(例如Microsoft的Visual
Basic)不使用用户输入的明确的行号,这是一个可怕且对所有人几乎都可见的“功能”,因为它在Basic的早期方言中是必需的。Lisp的现代变体(从Scheme开始)不使用动态作用域,

对我来说,立即可以在应用程序级别上复制打印功能并不是很明显。例如,有时我想从控制台将打印重定向为模式OS对话框。

不知道我遵循这个“要点”。只需更改sys.stdout为您喜欢的伪文件对象并重定向到您内心的内容即可-您可以 选择
对内置函数进行猴子补丁print(在Python 2中是从未有过的),但是没有人会扭曲您的手臂并强迫您这样做。

人们说很难将所有打印语句重写为一个函数,但他们已迫使每个Python 2.x开发人员为所有项目完全做到这一点。很好,使用自动转换器并不难。

2to3工具确实可以解决所有这些容易产生的表面不兼容性-
避免汗水(无论如何都需要运行它以照顾更多的灰尘print,因此人们确实在广泛使用它)。那么,您的“重点”是什么?

如果print是一个声明包装功能 print, 那么每个喜欢操纵功能print的人都会受到同样的照顾。

这样的安排本身不会删除不必要的关键字(最重要的是,消除不合理的 不规则性 ,正如我在上文中解释的那样: 没有 充分理由 成为
语句的语句,因为绝对不需要专门编译器以任何方式,形状或形式意识到它!)。对我而言,拥有这样一个基础函数会增加任何真正的价值还远远不够,但是如果您有真正的用例,那么您当然可以在Python
Ideas邮件列表中提出该案例-这样的基础函数,如果被证明确实很宝贵的话可以进行改进,以供printPython
2.7中的语句以及printPython 3.2中的函数使用。

但是,请考虑一种典型的情况,在这种情况下,可能需要猴子内置的猴子补丁print:添加关键字参数以允许花哨的调整。__print__您显然建议使用的函数将如何从__print__语句中生成那些KW参数?比恐怖>> myfile和尾随逗号还有趣的语法…?!随着print作为一个功能,关键字参数遵循这一点适用于完全正常的,普通的规则 每个
函数和函数调用-幸福!

因此,总而言之,print将其作为函数更像是Pythonic,因为它消除了异常,特殊情况以及对怪异的特殊语法的任何需要-
简单,规则和统一是Python的商标。

2021-01-20