[Python-ideas] Conditional context manager

MRAB python at mrabarnett.plus.com
Sat Oct 1 15:42:18 EDT 2016


On 2016-10-01 19:07, Neil Girdhar wrote:
> I'm just throwing this idea out there to get feedback.
>
> Sometimes, I want to conditionally enter a context manager.  This
> simplest (afaik) way of doing that is:
>
>     with ExitStack() as stack:
>         if condition:
>             cm = stack.enter_context(cm_function())
>         suite()
>
> I suggest a more compact notation:
>
>     with cm_function() as cm if condition:
>         suite()
>
> I'm not sure that this is possible within the grammar.  (For some reason
> with with_expr contains '"as" expr' rather than '"as" NAME'?
>
> I realize this comes up somewhat rarely.  I use context managers a lot,
> and it comes up maybe 1 in 5k lines of code.
>
> For some extensions of this notation, an else clause could bind a value
> to cm in the case that condition is false.
>
If you defined a null context manager, you could then write:

     with (cm_function() if condition else cm_null()) as cm:
         suite()

Do you need 'cm' itself? Its type changes depending on the condition, so 
I don't see how it could be useful.

If it's not needed, then that shortens a little to:

     with cm_function() if condition else cm_null():
         suite()



More information about the Python-ideas mailing list