Если вы хотите избежать дублирования кода и используете версию Python до 3.3 (где contextlib.ExitStack
недоступен), вы можете сделать что-то вроде:
class dummy_context_mgr():
def __enter__(self):
return None
def __exit__(self, exc_type, exc_value, traceback):
return False
или:
import contextlib
@contextlib.contextmanager
def 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()
.