为什么print语句不是pythonic?[关闭]
已关闭 。这个问题是基于观点的。它当前不接受答案。
想改善这个问题吗? 更新问题,以便通过编辑此帖子以事实和引用的形式回答。
7年前关闭。
这个问题困扰了我很长时间(正如我之前的问题所证明的):为什么print(x)
比(确切地说是更pythonic的)更好print x
?
对于那些不知道的人,该print
语句已更改为Python 3.0中的函数。正式文档在PEP
3105中,动机在Guido van
Rossum的电子邮件中。
对于这些问题,我想提出一个反对意见:
- 还有其他运算符,例如
import
我们写为语句的运算符,尽管它们的功能实际上与某个功能重复__import__
- 对于初学者来说,运算符
print
不属于一般的应用程序逻辑。对他们来说,神秘的运算符是他们程序的顶峰。他们希望它看起来有所不同。 - 现在 保证 所有描述基本Python 2.x的初学者书籍都 与第一个示例无关 。当然,语言有时会发生变化,但是对于新手来说,这些变化通常较不明显。
- 对我而言,立即
print
可以在应用程序级别上复制功能并不是很明显。例如,有时我想从控制台将打印重定向为模式OS对话框。 - 人们说很难将所有
print
语句重写为一个函数,但他们已迫使每个Python 2.x开发人员为所有项目完全做到这一点。很好,使用自动转换器并不难。 print
如果print
拥有语句包装功能,那么喜欢操纵功能的每个人都会得到同样的服务__print__
。
- 对于初学者来说,运算符
那么,我们能否在Stack Overflow页面上对这个问题有一个规范的答案?
-
在我看来,您的辩论是一场辩论,而不是一个问题,您是否真的要接受一个答案,表明您在主张中的错误和严重程度?
关于您的辩论要点:
还有其他运算符,例如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邮件列表中提出该案例-这样的基础函数,如果被证明确实很宝贵的话可以进行改进,以供print
Python
2.7中的语句以及print
Python 3.2中的函数使用。但是,请考虑一种典型的情况,在这种情况下,可能需要猴子内置的猴子补丁
print
:添加关键字参数以允许花哨的调整。__print__
您显然建议使用的函数将如何从__print__
语句中生成那些KW参数?比恐怖>> myfile
和尾随逗号还有趣的语法…?!随着print
作为一个功能,关键字参数遵循这一点适用于完全正常的,普通的规则 每个
函数和函数调用-幸福!因此,总而言之,
print
将其作为函数更像是Pythonic,因为它消除了异常,特殊情况以及对怪异的特殊语法的任何需要-
简单,规则和统一是Python的商标。