为什么 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.
我正在使用 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.