擅长:python、mysql、java
<p>我所知道的最干净的方法是:</p>
<pre><code>import functools
def decorator(original_function=None, optional_argument1=None, optional_argument2=None, ...):
def _decorate(function):
@functools.wraps(function)
def wrapped_function(*args, **kwargs):
...
return wrapped_function
if original_function:
return _decorate(original_function)
return _decorate
</code></pre>
<p><strong>说明</strong></p>
<p>当调用decorator时没有如下可选参数:</p>
<pre><code>@decorator
def function ...
</code></pre>
<p>函数作为第一个参数传递,decorate将按预期返回decorated函数。</p>
<p>如果使用一个或多个可选参数调用decorator,如下所示:</p>
<pre><code>@decorator(optional_argument1='some value')
def function ....
</code></pre>
<p>然后使用值为None的函数参数调用decorator,这样会返回一个decorate函数,如预期的那样。</p>
<p><strong>Python 3</strong></p>
<p>注意,上面的decorator签名可以使用Python 3特定的<code>*,</code>语法进行改进,以强制安全地使用关键字参数。只需将最外层函数的签名替换为:</p>
<pre><code>def decorator(original_function=None, *, optional_argument1=None, optional_argument2=None, ...):
</code></pre>