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
使用特殊语法会为演化设置更大的障碍,例如,当与print()
函数共存时,假设的新的printf()
函数并非遥不可及。 - 如果需要不同的分隔符(不是空格或根本没有),则没有简单的方法可以将
print
语句转换为其他调用。此外,根本没有简单的方法可以方便地使用除空格之外的其他分隔符来打印对象。 - 如果
print()
是一个函数,则在单个模块中替换它会容易得多(只需def print(*args):...
),甚至在整个程序中替换它(例如,通过在__builtin__.print
中放置一个不同的函数)。目前,可以通过编写一个具有write()
方法的类并将该类分配给sys.stdout
来实现这一点——这还不错,但绝对是一个更大的概念飞跃,并且它在与 print 不同的级别上工作。
规范
来自各种邮件列表并在最近发布在 python-3000 列表上的 print()
的签名 [3] 是
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
幸运的是,由于它在 Python 2 中是一个语句,因此 print
可以被可靠且明确地由自动化工具检测并替换,因此不应该存在主要的移植问题(前提是有人编写了提到的工具)。
实现
提议的更改已在 Subversion 修订版本 53685 到 53704 中的 Python 3000 分支中实现。库中的大多数遗留代码也已转换,但仍在努力捕获可能遗留在发行版中的每个 print 语句。
参考文献
版权
本文档已进入公有领域。
来源: https://github.com/python/peps/blob/main/peps/pep-3105.rst
上次修改: 2023-09-09 17:39:29 GMT