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 标志将设置为 1。
该提案略微更改了此测试,以便将 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
上次修改时间:2023-09-09 17:39:29 GMT