python func_Python functool module
1.functools.partial(func,*args,**keywords)
實現(xiàn)
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中提到的一個例子(用于實現(xiàn)緩存)
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。最簡單情況下調(diào)用memoize_uw應(yīng)該返回一個memoize的實例,然后調(diào)用memoize返回func,這樣我們得到的是memoize的實例。但是,我們希望得到的是被包裝函數(shù),也就是func的實例,實際上memoize和func的差別很小,我們可以通過一個函數(shù)實現(xiàn)。函數(shù)wrapper function中默認(rèn)參數(shù)assigned“指派”的內(nèi)容包括__module__, __name__, __qualname__, __annotations__, __doc__,使用默認(rèn)參數(shù)update“更新”的是__dict__,指派的意思是覆蓋,更新的意思是添加了func.attrF,也就是說memoize方法內(nèi)聲明的屬性(memoize.attrM)會被保留,但是訪問方法會更名為func.attrM。
在以下的示例中,使用update_wrapper和直接返回memoize的區(qū)別就是訪問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
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的python func_Python functool module的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 异地卡可以办网银吗?
- 下一篇: 刚安装ETC不能马上使用吗?