擅长:python、mysql、java
<pre><code>class Decontext(object):
"""
makes a context manager also act as decorator
"""
def __init__(self, context_manager):
self._cm = context_manager
def __enter__(self):
return self._cm.__enter__()
def __exit__(self, *args, **kwds):
return self._cm.__exit__(*args, **kwds)
def __call__(self, func):
def wrapper(*args, **kwds):
with self:
return func(*args, **kwds)
return wrapper
</code></pre>
<p>现在你可以:</p>
<pre><code>mydeco = Decontext(some_context_manager)
</code></pre>
<p>这使得</p>
<pre><code>@mydeco
def foo(...):
do_bar()
foo(...)
</code></pre>
<p>以及</p>
<pre><code>with mydeco:
do_bar()
</code></pre>