编程语言
首页 > 编程语言> > 使用上下文管理器将python脚本输出到文件吗?

使用上下文管理器将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