Python contextlib.redirect\u stdout总是一个好主意吗?

Python contextlib.redirect\u stdout总是一个好主意吗?,python,file,python-3.x,stdout,Python,File,Python 3.x,Stdout,自从我了解了这个模式,我一直在使用 with open('myfile.txt','w') as myfile: with contextlib.redirect_stdout(myfile): # stuff print(...) # gets redirected to file 这使我可以使用打印语法(我更喜欢)来写入文件,并且我可以轻松地将其注释出来,以便打印到屏幕上进行调试。然而,通过这样做,我将失去写入文件和屏幕的能力,并且可能会编写不太清晰

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

with open('myfile.txt','w') as myfile:
    with contextlib.redirect_stdout(myfile):
        # stuff
        print(...) # gets redirected to file
这使我可以使用打印语法(我更喜欢)来写入文件,并且我可以轻松地将其注释出来,以便打印到屏幕上进行调试。然而,通过这样做,我将失去写入文件和屏幕的能力,并且可能会编写不太清晰的代码。我还应该了解其他缺点吗?这是我应该使用的模式吗

这是我应该使用的模式吗

在这种情况下,我确实认为您的模式不是惯用的,并且可能会让代码的读者感到困惑。内置的
print
(因为这是一个Python-3x问题)已经有了一个类似于
redirect\u stdout
在您的示例中所做的操作:

with open('myfile.txt', 'w') as myfile:
    print('foo', file=myfile)
而引入
redirect\u stdout
只会让读者想知道为什么不使用内置功能。(就我个人而言,我发现嵌套的
很难看。
\
分开的
更难看。)

至于注释输出的方便性(以及打印到
stdout
和文件),您可以有任意多个
print
调用,并根据需要注释它们

with open('myfile.txt', 'w') as myfile:
    print('foo')
    print('foo', file=myfile)
还有其他我应该知道的缺点吗

我想不出什么确切的答案,除了它可能不是最好的解决方案(如本例)

编辑:

从:

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

,关于如何准确地执行您一直在做的事情,有很多关于重定向
stdout
的缺点的评论和答案,特别是下面的评论:

使用磁盘缓存时,原始的性能应该是可以接受的。然而,这种解决方案的缺点是,如果有大量输出,内存需求就会膨胀。虽然这里可能没什么好担心的,但如果可能的话,通常避免这样做是一个好主意。与使用xrange(py3 range)代替range等相同的想法–Gringo Suave


我同意你在这里的评估,但它确实提出了一个问题——为什么首先要使用
contextlib.redirect\u stdout
?我认为答案是这样的,你可以把你不想控制的函数的输出发送到你想要的任何地方(比如想想
dis.dis
)@mgilson也许你需要教我你心目中的
dis.dis
例子。我不知道为什么我们不使用该函数的
文件
参数。我认为
redirect\u stdout
存在的原因,尽管只是我的猜测,是因为并非每个API都有
文件
选项,如
print
dis.dis
。没有
文件
参数,我不知道他们在python3.x中添加了它(可能是在他们添加
重定向
上下文库
:-P)的时候,如果旧的
dis.code>缺少
文件
参数(我的Python年龄还不足以知道),那么是的,我同意这是
重定向\u stdout
的一个用例。可能仍然存在这样的API,因此
重定向\u stdout
将存在一段时间。许多优点。我没有考虑到线索的含义。