<p>在Python3.2+中,您可以使用<a href="https://docs.python.org/library/contextlib.html#contextlib.contextmanager" rel="noreferrer">^{<cd1>}</a>定义一个上下文管理器,它也是一个装饰器。</p>
<p>从文档中:</p>
<blockquote>
<p><a href="https://docs.python.org/library/contextlib.html#contextlib.contextmanager" rel="noreferrer"><code>contextmanager()</code></a> uses <a href="https://docs.python.org/library/contextlib.html#contextlib.ContextDecorator" rel="noreferrer"><code>ContextDecorator</code></a> so the context managers it creates can be used as decorators as well as in <a href="https://docs.python.org/reference/compound_stmts.html#with" rel="noreferrer"><code>with</code></a> statements</p>
</blockquote>
<p>示例用法:</p>
<p/><pre><code>>>> <b><i>from contextlib import contextmanager</i></b>
>>> <b><i>@contextmanager</i></b>
... <b><i>def example_manager(message):</i></b>
... <b><i> print('Starting', message)</i></b>
... <b><i> try:</i></b>
... <b><i> yield</i></b>
... <b><i> finally:</i></b>
... <b><i> print('Done', message)</i></b>
...
>>> <b><i>with example_manager('printing Hello World'):</i></b>
... <b><i> print('Hello, World!')</i></b>
...
Starting printing Hello World
Hello, World!
Done printing Hello World
>>>
>>> <b><i>@example_manager('running my function')</i></b>
... <b><i>def some_function():</i></b>
... <b><i> print('Inside my function')</i></b>
...
>>> <b><i>some_function()</i></b>
Starting running my function
Inside my function
Done running my function</code></pre>