【问题标题】:Is contextlib.redirect_stdout always a good idea?contextlib.redirect_stdout 总是一个好主意吗?
【发布时间】:2016-02-12 18:48:33
【问题描述】:

自从我了解了这个模式,我就一直在使用

with open('myfile.txt','w') as myfile:
    with contextlib.redirect_stdout(myfile):
        # stuff
        print(...) # gets redirected to file

这让我可以使用打印语法(我更喜欢)来写入文件,并且我可以轻松地将其注释掉以打印到屏幕上进行调试。但是,通过这样做,我将无法同时写入文件和屏幕,并且可能会编写不太清晰的代码。还有其他我应该知道的缺点吗?这是我应该使用的模式吗?

【问题讨论】:

    标签: python file python-3.x stdout


    【解决方案1】:

    这是我应该使用的模式吗?

    在这种特殊情况下,我确实认为您的模式不是惯用的,并且可能会使您的代码读者感到困惑。内置 print (因为这是一个 Python-3x 问题)已经有一个 file keyword argument ,它将完全按照您的示例中的 redirect_stdout 所做的:

    with open('myfile.txt', 'w') as myfile:
        print('foo', file=myfile)
    

    并介绍redirect_stdout 只会让您的读者想知道您为什么不使用内置功能。 (就我个人而言,我觉得嵌套的 with 丑陋。\-separated with 更丑陋。)

    至于注释掉的方便性(以及打印到stdout 和文件),你可以有尽可能多的print 调用,并根据需要将它们注释掉

    with open('myfile.txt', 'w') as myfile:
        print('foo')
        print('foo', file=myfile)
    

    还有什么我应该知道的缺点

    除了它可能不是最好的解决方案(就像在这种情况下)之外,我没有任何明确的想法。

    编辑:

    来自doc

    请注意,对 sys.stdout 的全局副作用意味着此上下文 manager 不适合在库代码和大多数线程中使用 应用程序。对子流程的输出也没有影响。

    【讨论】:

    • 我同意你的评估,但它确实引出了一个问题——为什么首先要有contextlib.redirect_stdout?而且我认为答案是这样您就可以发送您无法控制的函数的输出(例如考虑dis.dis
    • @mgilson 也许您需要告诉我您想到的dis.dis 示例。我不确定为什么我们不只使用该函数的 file 参数。我认为redirect_stdout 存在的原因虽然只是我的猜测,但不是每个API 都有file 选项,如printdis.dis
    • 好吧,看来我选择了一个糟糕的例子。 In python2.7, dis.dis 没有 file 参数,我没有意识到他们在 python3.x 中的某个时候添加了它(可能同时他们将 redirect_stdout 添加到 contextlib :-P)
    • @mgilson 如果旧的dis.dis 缺少file 参数(而且我的Python 年龄还不足以知道这一点),那么是的,我同意这是redirect_stdout 的用例.可能仍然存在这样的 API,因此redirect_stdout 将存在一段时间。
    • 很多优点。我没有考虑线程含义。
    【解决方案2】:

    This question,关于如何准确地做你一直在做的事情有很多关于重定向stdout 的缺点的答案和答案,尤其是对答案之一的评论:

    加上原版的磁盘缓存性能应该是可以接受的。但是,如果有大量输出,此解决方案的缺点是内存需求激增。虽然这里可能没什么好担心的,但如果可能的话,通常最好避免这种情况。与使用 xrange (py3 range) 代替 range 等的想法相同 – Gringo Suave

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-05
      • 1970-01-01
      • 2012-04-02
      • 2012-10-16
      • 2020-03-29
      • 1970-01-01
      • 2013-04-01
      • 2010-12-28
      相关资源
      最近更新 更多