Following system colour scheme - Python 增强提案 Selected dark colour scheme - Python 增强提案 Selected light colour scheme - Python 增强提案

Python 增强提案

PEP 3105 – 将 print 变为函数

作者:
Georg Brandl <georg at python.org>
状态:
最终版
类型:
标准跟踪
创建日期:
2006年11月19日
Python 版本:
3.0
发布历史:


目录

摘要

标题说明了一切——本 PEP 提出一个新的内置 print() 函数,它将取代 print 语句,并为这个新函数建议了一个特定的签名。

基本原理

print 语句长期以来一直出现在 Python 3000 中将要移除的可疑语言特性列表中,例如 Guido 的“Python 遗憾”演示文稿 [1]。因此,本 PEP 的目标并非新鲜事,尽管它可能会在 Python 开发者中引起诸多争议。

以下支持 print() 函数的论点摘自 Guido 本人发出的 python-3000 邮件 [2]

  • print 是唯一一个拥有专用语句的应用程序级功能。在 Python 的世界中,语法通常作为最后手段使用,即当没有编译器的帮助就无法完成某事时。Print 不符合这样的例外情况。
  • 在应用程序开发中的某个阶段,人们常常需要用更复杂的方式替换 print 输出,例如日志调用或对其他 I/O 库的调用。使用 print() 函数,这只是一个简单的字符串替换,而今天则是一团糟,需要添加所有这些括号并可能转换 >>stream 风格的语法。
  • print 设置特殊语法为演变设置了更大的障碍,例如,当一个假设性的新 printf() 函数与 print() 函数共存时,这并非遥不可及。
  • 如果需要不同的分隔符(不是空格,或者根本不需要),没有简单的方法可以将 print 语句转换为另一个调用。此外,根本没有简单的方法可以方便地用空格以外的其他分隔符打印对象。
  • 如果 print() 是一个函数,那么在一个模块内替换它会容易得多(只需 def print(*args):...),甚至在整个程序中替换(例如,通过在 __builtin__.print 中放入一个不同的函数)。就目前而言,可以通过编写一个带有 write() 方法的类并将其分配给 sys.stdout 来实现——这不错,但无疑是一个更大的概念飞跃,并且它与 print 在不同级别上工作。

规范

取自各种邮件列表并最近发布在 python-3000 列表 [3] 上的 print() 签名是

def print(*args, sep=' ', end='\n', file=None)

像这样的调用

print(a, b, c, file=sys.stderr)

将等同于今天的

print >>sys.stderr, a, b, c

而可选的 sepend 参数分别指定在参数之间和之后打印的内容。

softspace 功能(文件上的一个半秘密属性,当前用于告诉 print 是否在第一个项目之前插入空格)将被移除。因此,今天的

print "a",
print

将不会直接翻译,它不会在 "a" 和换行符之间打印空格。

向后兼容性

本 PEP 中提出的更改将使今天的大多数 print 语句无效。只有那些偶然地在所有参数周围带有括号的语句在 3.0 版本中仍将是有效的 Python 语法,并且在这些语句中,只有那些打印单个带括号值的语句将继续执行相同的操作。例如,在 2.x 中

>>> print ("Hello")
Hello
>>> print ("Hello", "world")
('Hello', 'world')

而在 3.0 中

>>> print ("Hello")
Hello
>>> print ("Hello", "world")
Hello world

幸运的是,由于 print 在 Python 2 中是一个语句,它可以通过自动化工具可靠且无歧义地检测和替换,因此不应该存在重大的移植问题(前提是有人编写了前面提到的工具)。

实施

提议的更改已在 Subversion 修订版本 53685 到 53704 中在 Python 3000 分支中实现。库中的大部分旧代码也已转换,但仍在努力捕获分发中可能遗留的每个 print 语句。

参考资料


来源: https://github.com/python/peps/blob/main/peps/pep-3105.rst

上次修改时间: 2025-02-01 08:59:27 GMT