上下文管理器是可以与with
语句一起使用的东西。它被明确设计为:
例如,open
可以用作上下文管理器。在下面的代码中
with open(...) as f:
# do stuff
没关系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 in的任何写操作都stuff
将转到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()
几乎可以肯定这是过度杀伤力。