使用上下文管理器将python脚本输出到文件吗?
作者:互联网
我正在编写一个脚本,我可以选择在脚本中将其结果打印到stdout还是预定义的结果文件中,并通过命令行传递.如下所示.我现在已经阅读了一些有关Python中上下文管理器的内容,但是我不确定在这种特定情况下是否以及如何使用上下文管理器.所以我在寻找建议
>在此问题中使用上下文管理器是否有意义
>如何实施它.
因此,没有上下文管理器的代码是:
option_file = True # would come from OptionParser in real code
if option_file:
out = open("resultsfile", "w")
else:
out = sys.stdout
# do some computations
out.write("Results of script")
# more computations and calls to out.write
if option_file:
out.close()
解决方法:
上下文管理器可以与with语句一起使用.它被明确设计为:
>执行一些设置,
>给您一个对象,然后
>再次执行一些拆卸(即使引发异常).
例如,open可用作上下文管理器.在下面的代码中
with open(...) as f:
# do stuff
不管是什么东西,该文件将始终关闭. (好吧,通常.除非在愚蠢的情况下,例如关闭电源或终止进程.)
在这种情况下,应使用上下文管理器.在我看来,它看起来并不像您一样,因此我认为没有必要使用上下文管理器.
还有一种使用上下文管理器的替代(而不是更好或更坏,只是有所不同)的代码编写方式.如果要临时重定向stdout,但要确保完成后将其还原,那么您就处于上述情况.这是一个例子:
@contextlib.contextmanager
def redirect_stdout(stream):
import sys
sys.stdout = stream
yield
sys.stdout = sys.__stdout__
然后,您可以编写如下代码
with open(...) as f:
with redirect_stdout(f):
# do stuff
而对stdout的任何写操作都将改为f.
编辑:您是正确的,没有条件有条件拥有上下文管理器:要么您在其中,要么不在.您可以随时编写自己的内容,但可能无济于事:
@contextlib.contextmanager
def maybe_open(path, do_nothing=True):
if do_nothing:
f = None
yield sys.stdout
else:
f = open(path)
yield f
if f:
f.close()
几乎可以肯定这是过度杀伤力.
标签:contextmanager,file-io,python 来源: https://codeday.me/bug/20191101/1987249.html