上下文管理器是可以与
with语句一起使用的东西。它被明确设计为:
- 执行一些设置,
- 给你一个对象
- 再次执行一些拆卸(即使您引发异常)。
例如,
open可以用作上下文管理器。在下面的代码中
with open(...) as f: # do stuff
没关系
stuff,文件将始终关闭。(好吧,通常。除非在愚蠢的情况下,例如关闭电源或终止进程。)
在这种情况下,应使用上下文管理器。在我看来,它看起来并不像您一样,因此我认为没有理由要使用上下文管理器。
还有一种使用上下文管理器的替代(而不是更好或更坏,只是有所不同)的代码编写方式。如果您想
stdout暂时重定向-但要确保在完成后将其还原-
那么您就处于上述情况。这是一个例子:
@contextlib.contextmanagerdef redirect_stdout(stream): import sys sys.stdout = stream yield sys.stdout = sys.__stdout__
然后,您可以编写如下代码
with open(...) as f: with redirect_stdout(f): # do stuff
而对stdout in的任何写操作都
stuff将转到
f。
编辑:您是对的,没有条件有条件拥有上下文管理器是正确的:要么您在其中,要么不在。您可以随时编写自己的内容,但可能无济于事:
@contextlib.contextmanagerdef maybe_open(path, do_nothing=True): if do_nothing: f = None yield sys.stdout else: f = open(path) yield f if f: f.close()
几乎可以肯定这是过度杀伤力。



