在我看来,你的问题是一场辩论,而不是一个问题——你真的会接受一个表明你的断言有多么严重和严重错误的答案吗?!
关于你的辩论点:
还有其他的操作符,比如我们写成语句的 import,虽然它们的功能实际上是和一个函数重复的__import__
绝对错误:函数__import__
(就像其他所有函数——和运算符一样)在“调用者”(包含它的代码)范围内不绑定任何名称——任何在“调用者范围”中绑定名称的“事物”必须是语句(就像赋值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__
获取这些 KW 参数?__print__
一些更时髦的语法比恐怖的>> myfile
逗号和尾随的逗号......?!作为print
函数,关键字参数遵循适用于每个函数和函数调用的完全正常和普通的规则——幸福!
因此,总而言之,print
作为一个函数,它更像 Pythonic,因为它消除了异常、特殊情况以及任何对奇怪的特殊语法的需求——简单、规律和统一是 Python 的商标。