繁体   English   中英

contextlib.redirect_stdout总是一个好主意吗?

[英]Is contextlib.redirect_stdout always a good idea?

自从我了解了这种模式以来,我一直在使用

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

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

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

在这种情况下,我确实认为您的模式不是惯用的,并且可能会使您的代码阅读者感到困惑。 内置print (因为这是一个Python-3x问题)已经具有file关键字参数 ,该参数将完全执行您的示例中的redirect_stdout作用:

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

并引入redirect_stdout只会使您的读者感到奇怪,为什么不使用内置功能。 (就我个人而言,我发现它with丑陋嵌套。 \\ with更丑陋分开。)

至于注释的便捷性(以及打印到stdout和文件中的便捷性),那么您可以根据需要进行任意数量的print调用,并根据需要注释掉它们

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

还有其他我应该知道的缺点吗

除了它可能不是最好的解决方案(在这种情况下)之外,我没有什么可以想到的。

编辑:

文档

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

这个问题 ,关于如何准确地做您一直在做的事情,有很多关于重定向stdout的弊端的评论和答案,尤其是对以下答案之一的评论:

具有磁盘缓存的原始性能应该是可以接受的。 但是,如果有很多输出,则此解决方案的缺点是会增加内存需求。 尽管这里不必担心,但是最好避免这种情况。 与使用xrange(py3范围)代替范围等相同的想法。– Gringo Suave

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM