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

|image0|

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

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

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

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

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

试验代码如下:

.. code:: python

   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|

.. |image0| image:: http://image.iswbm.com/20200804124133.png
.. |image1| image:: http://image.iswbm.com/20200607174235.png