有没有一种方法可以用with语句开始代码块,但是有条件地?

就像是:

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

# do nearly the same large block of stuff,
# involving gs or not, depending on needs_with()

为了澄清起见,一种情况将在with语句中包含一个块,而另一种可能性将是相同的块,但未将其包围(即,好像没有缩进一样)

当然,最初的实验会产生压痕错误。

最佳答案

如果要避免重复代码,并使用3.7(引入contextlib.nullcontext时)甚至3.3(引入contextlib.ExitStack时)之前的Python版本,则可以执行以下操作:

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()返回不同​​的内容。

(有关后续版本中的操作,请参见Mike's answerDaniel's answer。)

07-26 09:30