Following system colour scheme Selected dark colour scheme Selected light colour scheme

Python 增强提案

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