Conditional with statement in Python

前端 未结 8 1329
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-28 06:04

Is there a way to begin a block of code with a with statement, but conditionally?

Something like:

if needs_with():
    with get_stuff() as gs:

# do          


        
8条回答
  •  旧巷少年郎
    2020-11-28 06:15

    Python 3.3 introduced contextlib.ExitStack for just this kind of situation. It gives you a "stack", to which you add context managers as necessary. In your case, you would do this:

    from contextlib import ExitStack
    
    with ExitStack() as stack:
        if needs_with():
            gs = stack.enter_context(get_stuff())
    
        # do nearly the same large block of stuff,
        # involving gs or not, depending on needs_with()
    

    Anything that is entered to stack is automatically exited at the end of the with statement as usual. (If nothing is entered, that's not a problem.) In this example, whatever is returned by get_stuff() is exited automatically.

    If you have to use an earlier version of python, you might be able to use the contextlib2 module, although this is not standard. It backports this and other features to earlier versions of python. You could even do a conditional import, if you like this approach.

提交回复
热议问题