[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#790685: ITP: python-conditional -- conditionally enter a context manager



On Wed, Jul 01, 2015 at 08:14:56AM +0100, Neil Williams wrote:
> If I had upstream code which needed this support, I'd just embed it
> into the project and update the copyright instead of having a package
> for 18 lines in the first place.

Without really wishing to weigh in on whether it should be in Debian
(given an upstream that uses it, I can see it being reasonable for a
Debian maintainer to package it rather than patch away its use), I
recently implemented this elsewhere as the equivalent of:

  import contextlib

  if condition:
      context = ...
  else:
      # A no-op context manager.
      context = contextlib.contextmanager(lambda: (None for _ in [None]))()
  with context:
      ...

If you can use Python >= 3.3 (in the code in question this is sadly
still some way off), then you can simplify this using
contextlib.ExitStack:

  import contextlib

  with contextlib.ExitStack() as stack:
      if condition:
          stack.enter_context(...)
      ...

The important feature of any of these approaches is to avoid duplicating
the body of the "with" statement.

-- 
Colin Watson                                       [cjwatson@debian.org]


Reply to: