【问题标题】:Why does print argument flush default to False?为什么 print 参数刷新默认为 False?
【发布时间】:2019-01-26 11:25:17
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

  • 糟糕,我没睡够。我在问题中混淆了真假(标题是正确的)。谢谢!
  • @alex 见perl.plover.com/FAQs/Buffering.html(忽略 Perl 的特定部分(其中一些现在有点过时了),但一般概念适用)。

标签: python output-buffering


【解决方案1】:

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

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


我已经四处寻找,看看是否有任何关于动机的文字证据。在 issue 13761 中记录了添加 flush 关键字。显然,在 2012 年提出了将 stdout 的默认设置为 True 的建议,并被驳回(参见讨论的底部)。我想这就是一个可以应用 Python 之禅的地方:“特殊情况并不足以打破规则。”(没有特殊待遇,因为我们写信给sys.stdout。; )

在 BDFL 本人声明的邮件列表中还有一个link

我可以在 print() 中添加一个新的关键字参数 3.3 强制刷新,只要默认关闭即可。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 2013-05-31
    • 2019-10-21
    • 2023-03-08
    相关资源
    最近更新 更多