1.functools.partial(func,*args,**keywords)
实现
def partial(func, *args, **keywords):def newfunc(*fargs, **fkeywords):
newkeywords=keywords.copy()
newkeywords.update(fkeywords)return func(*args, *fargs, **newkeywords)
newfunc.func=func
newfunc.args=args
newfunc.keywords=keywordsreturn newfunc
例子
>>> from functools importpartial>>> basetwo = partial(int, base=2)>>> basetwo.__doc__ = 'Convert base 2 string to an int.'
>>> basetwo('10010')18
2.functools.update_wrapper(wrapper,wrapped,assigned=WRAPPER_ASSIGNMENTS,updated=WRAPPER_UPDATES)
将wrapper function更新为wrapped function,多用于decorator,以decorator module中提到的一个例子(用于实现缓存)
defmemoize_uw(func):
func.cache={}def memoize(*args, **kw):if kw: #frozenset is used to ensure hashability
key =args, frozenset(kw.items())else:
key=argsif key not infunc.cache:
func.cache[key]= func(*args, **kw)returnfunc.cache[key]return functools.update_wrapper(memoize, func)
这里memoize就是wrapper function,func就是wrapped function。最简单情况下调用memoize_uw应该返回一个memoize的实例,然后调用memoize返回func,这样我们得到的是memoize的实例。但是,我们希望得到的是被包装函数,也就是func的实例,实际上memoize和func的差别很小,我们可以通过一个函数实现。函数wrapper function中默认参数assigned“指派”的内容包括__module__, __name__, __qualname__, __annotations__, __doc__,使用默认参数update“更新”的是__dict__,指派的意思是覆盖,更新的意思是添加了func.attrF,也就是说memoize方法内声明的属性(memoize.attrM)会被保留,但是访问方法会更名为func.attrM。
在以下的示例中,使用update_wrapper和直接返回memoize的区别就是访问f1.__doc__得到的是"Simulate some long computation"还是None
@memoize_uwdeff1(x):"Simulate some long computation"time.sleep(1)return x
3.@functools.wraps(wrapped,assigned=WRAPPER_ASSIGNMENTS,updated=WRAPPER_UPDATES)
wraps是update_wrapper的语法糖,从parameter来看就知道少了一个wrapper,于是乎就可以写成
defmemoize_uw(func):
func.cache={}
@wraps(func)def memoize(*args, **kw):if kw: #frozenset is used to ensure hashability
key =args, frozenset(kw.items())else:
key=argsif key not infunc.cache:
func.cache[key]= func(*args, **kw)returnfunc.cache[key]return memoize