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
而可选的 sep
和 end
参数分别指定在参数之间和之后打印的内容。
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