擅长:python、mysql、java
<p><code>contextlib.contextmanager</code>在这里似乎更合适。请注意,与其他任何东西一样,您不能从函数外部访问函数体的局部变量(无论如何,除了内省技巧之外)。在</p>
<pre><code>@contextlib.contextmanager
def savePen(dc):
prevPen = dc.GetPen()
yield
dc.SetPen(prevPen)
with savePen(dc):
func(dc, param1, param2)
</code></pre>
<p>注意,使用<code>ContextDecorator</code>,上下文管理器是不带参数的实例化的,即</p>
^{pr2}$
<p>语法糖(根据文档)是</p>
<pre><code>def func(dc, param1, param2):
with savePen():
...
</code></pre>
<p>所以没有办法告诉<code>savePen</code>要使用哪个对象(<code>dc</code>)。在</p>