有没有一种方法可以用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 answer或Daniel's answer。)