1.30 break /continue 和 上下文管理器哪个优先级高?

image0

众所周知,在循环体中(无论是 for 还是 while),continue 会用来跳入下一个循环,而 break 则用来跳出某个循环体。

同时我们又知道:在上下文管理器中,被包裹的程序主体代码结束会运行上下文管理器中的一段代码(通常是资源的释放)。

但如果把上下文管理器放在一个循环体中,而在这个上下文管理器中执行了 break ,是否会直接跳出循环呢?

换句话说,上下文管理器与 break/continue 这两个规则哪一个优先级会更高一些?

这个问题其实不难,只要做一下试验都能轻易地得出答案,难就难在很多对这个答案都是半猜半疑,无法肯定地回答。

试验代码如下:

import time
import contextlib

@contextlib.contextmanager
def runtime(value):
    time.sleep(1)
    print("start: a = " + str(value))
    yield
    print("end: a = " + str(value))


a = 0
while True:
    a+=1
    with runtime(a):
        if a % 2 == 0:
            break

从输出的结果来看,当 a = 2 时执行了 break ,此时的并不会直接跳出循环,依然要运行上下文管理器里清理释放资源的代码(示例中,我使用 print 来替代)。

start: a = 1
end: a = 1
start: a = 2
end: a = 2

另外还有几个与此类似的问题,我这里也直接给出答案,不再细说了

  1. continue 与 break 一样,如果先遇到上下文管理器会先进行资源的释放

  2. 上面只举例了 while 循环体,而 for 循环也是同样的。

image1