擅长:python、mysql、java
<p>可以将构造的对象存储在变量中,如:</p>
<pre><code>if some_condition:
cm = ContextManager(**args)
else:
cm = OtherContextManager(**other_args)
with cm as contex:
... # some block
</code></pre>
<p>上述内容可以很容易地扩展到三个可能的上下文管理器,等等。例如,您还可以决定在“进入”上下文之前首先“修补”上下文管理器。你知道吗</p>
<p>尽管像<code>with foo() as bar:</code>这样的模式很常见,但实际上Python只是计算<code>foo()</code>,获取该元素,并调用对象上的<code>.__enter__()</code>。该方法的结果存储在<code>bar</code>中。你知道吗</p>
<p>因此<code>foo()</code><em>调用没有什么“特别之处”,您可以使用左侧的任何类型的对象。例如,您可以将<code>if</code>-<code>else</code>逻辑封装在一个单独的函数中,并返回上下文管理器,然后使用变量,或将上下文管理器作为参数传递。只要在<code>with</code>语句中使用它,Python就会在幕后调用<code>.__enter__(..)</code>和<code>.__exit__(..)</code>。你知道吗</p>