如果要避免重复代码,并使用3.7(
contextlib.nullcontext引入时)甚至3.3(引入时)之前的Python版本
contextlib.ExitStack,则可以执行以下操作:
class dummy_context_mgr(): def __enter__(self): return None def __exit__(self, exc_type, exc_value, traceback): return False
要么:
import contextlib@contextlib.contextmanagerdef dummy_context_mgr(): yield None
然后将其用作:
with get_stuff() if needs_with() else dummy_context_mgr() as gs: # do stuff involving gs or not
您也可以根据
get_stuff()返回不同的值
needs_with()。
(有关在以后的版本中可以做什么的信息,请参阅Mike的答案
从Python 3.7开始,您可以使用
contextlib.nullcontext:
from contextlib import nullcontextif needs_with(): cm = get_stuff()else: cm = nullcontext()with cm as gs: # Do stuff
contextlib.nullcontext几乎只是一个无操作上下文管理器。如果您依赖在as:之后存在的内容,则可以为其传递一个将产生的参数:
>>> with nullcontext(5) as value:... print(value)...5
否则它将返回None:
>>> with nullcontext() as value:... print(value)...None
超级整洁,请在此处查看文档:https : //docs.python.org/3/library/contextlib.html#contextlib.nullcontext



