ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

使用上下文管理器将python脚本输出到文件吗?

2019-11-01 23:56:05  阅读:199  来源: 互联网

标签:contextmanager file-io 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有