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
将存在一段时间。许多优点。我没有考虑到线索的含义。