<p>通常,您只需使用<em>包装</em>,它包装*update_wrapper*。更多:</p>
<ul>
<li><p><em>partial</em>ing a function=创建一个新函数,其中一些参数绑定到值</p></li>
<li><p><em>包装</em>部分*用<em>包装</em>更新包装器*,从而为<em>包装器</em></p></li>
<li><p>*update_wrapper*的目的是将某些属性(而不是参数)从<em>wrapped</em>复制到<em>wrapper</em>。默认为:</p></li>
</ul>
<pre>
WRAPPER_ASSIGNMENTS = ('__module__', '__name__', '__qualname__', '__doc__',
'__annotations__')
WRAPPER_UPDATES = ('__dict__',)
</pre>
<p>一个有用的例子:</p>
<pre><code>try:
from itertools import izip_longest as zip_longest
except:
from itertools import zip_longest
from collections import Iterable
from functools import wraps
def ziplongest(*args):
'''zip_longest with last element as filler
>>> args=([9],[2,3],1)
>>> [t for t in ziplongest(*args)]
[(9, 2, 1), (9, 3, 1)]
'''
iterable = lambda a:(a if isinstance(a,Iterable) else [a])
_args = [iterable(a) for a in args]
withnone = zip_longest(*_args)
for e in withnone:
yield tuple((en or _args[i][-1]) for i,en in enumerate(e))
def listable(f):
'''apply f to list members
>>> @listable
... def mul(a,b):
... 'returns a*b'
... return a*b
>>> mul(2,[3,9])
[6, 18]
>>> mul.__doc__
'returns a*b'
'''
@wraps(f)#without this e.g __doc__ would get hidden
def to_elems(*args,**kwargs):
if any(isinstance(x,list) for x in args):
return [f(*a,**kwargs) for a in ziplongest(*args)]
else:
return f(*args,**kwargs)
return to_elems
</code></pre>