PEP 259 – 打印换行符后省略换行符
- 作者:
- Guido van Rossum <guido at python.org>
- 状态:
- 已拒绝
- 类型:
- 标准跟踪
- 创建日期:
- 2001年6月11日
- Python 版本:
- 2.2
- 发布历史:
- 2001年6月11日
摘要
目前,print 语句总是附加一个换行符,除非使用了尾随逗号。这意味着如果我们要打印的数据已经以换行符结尾,我们将得到两个换行符,除非采取特殊预防措施。
我建议当换行符后面跟着来自数据的换行符时,跳过打印换行符。
为了避免不得不向文件对象添加另一个魔法变量,我建议给现有的“softspace”变量一个额外的含义:负值将意味着“写入的最后一个数据以换行符结尾,因此不需要空格或换行符。”
问题
当打印类似于使用简单循环从文件中读取的行的数据时,除非特别小心,否则会出现双倍行距。
>>> for line in open("/etc/passwd").readlines():
... print line
...
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:
daemon:x:2:2:daemon:/sbin:
(etc.)
>>>
虽然有简单的变通方法,但这通常只在测试期间才被注意到,并且需要额外的编辑-测试往返;修复后的代码更丑陋,更难维护。
提议的解决方案
在 ceval.c 中的 PRINT_ITEM 操作码中,当打印字符串对象时,已经有一个检查会查看该字符串的最后一个字符。目前,如果最后一个字符是除空格以外的空白字符,则 softspace 标志将重置为零;这会抑制两个项目之间的空格,如果第一个项目是以换行符、制表符等结尾的字符串(但不是以空格结尾)。否则 softspace 标志将设置为一。
该提案略微改变了此测试,以便 softspace 设置为
-1– 如果写入的最后一个对象是以换行符结尾的字符串0– 如果写入的最后一个对象是以既不是空格也不是换行符的空白字符结尾的字符串1– 在所有其他情况下(包括写入的最后一个对象是空字符串或不是字符串的情况)
然后,在 PRINT_NEWLINE 操作码中,如果 softspace 的值为负,则抑制换行符的打印;在任何情况下 softspace 标志都将重置为零。
范围
这仅影响 8 位字符串的打印。它不影响 Unicode,尽管这可能被认为是 Unicode 实现中的一个错误。它不影响其字符串表示恰好以换行符结尾的其他对象。
风险
此更改会破坏一些现有代码。例如
print "Subject: PEP 259\n"
print message_body
在当前的 Python 中,这会生成一个空行,将主题与消息正文分开;通过建议的更改,正文紧接在主题下方开始。无论如何,这都不是非常健壮的代码;更好地写成
print "Subject: PEP 259"
print
print message_body
在测试套件中,只有 test_StringIO(它明确测试此功能)会中断。
实施
相对于当前 CVS 的补丁在此
http://sourceforge.net/tracker/index.php?func=detail&aid=432183&group_id=5470&atid=305470
已拒绝
用户社区一致拒绝了这一点,因此我将不再追求这个想法。经常听到的反对意见包括
- 它可能会破坏数千个 CGI 脚本。
- 已经够魔法了(还有:请不要再修补“print”了)。
版权
本文档已置于公共领域。
来源:https://github.com/python/peps/blob/main/peps/pep-0259.rst