为什么 print argument flush 默认为 False?

Why does print argument flush default to False?

我正在使用 print 记录我的 python 脚本的执行情况。

我到处都使用 flush = True,否则打印语句有时不会出现在它们所在的位置。

我想知道为什么默认是 flush = False。谁能解释一下?

谢谢!

默认情况下不强制使用 flush,您将该决定留给了您要写入的基础对象。对于 sys.stdin / stderr 这将默认为行缓冲 _io.TextIOWrapper 这通常是您在交互式控制台上所期望和想要的。当您将输出交换为文件时,不强制每个 print/write 使用 flush 的默认设置似乎是合理的。相反,在每次打印后强制 flush 会覆盖基础对象的 buffering/flushing 行为。

明显的警告是,例如当您 运行 通过 tee 的脚本时,进程自己的 stdout 没有直接写入终端。


我又查了一下,看看是否有任何关于动机的文字证据。 issue 13761 中记录了添加 flush 关键字。显然,关于 stdout 默认为 True 的建议是在 2012 年提出的,并被驳回(见讨论底部)。我想这是可以应用 Python 的禅宗的地方:"Special cases aren't special enough to break the rules."(没有特殊处理,只是因为我们正在写信给 sys.stdout。; )

在邮件列表中还有一个 link BDFL 自己声明:

I would be fine with adding a new keyword argument to print() in 3.3 to force a flush, as long as it defaults to off.