python functools庫的作用

functools這個庫裏面還有很多有用的東西
functools.cmp_to_key(func)
將(舊式的Python2)比較函數轉換爲新式的 key function

@functools.lru_cache(maxsize=128, typed=False)
一個爲函數提供緩存功能的裝飾器,緩存 maxsize 組傳入參數,在下次以相同參數調用時直接返回上一次的結果。用以節約高開銷或I/O函數的調用時間。
由於使用了字典存儲緩存,所以該函數的固定參數和關鍵字參數必須是可哈希的。

from functools import lru_cache
import urllib

@lru_cache(maxsize=32)
def get_pep():
resource = ‘http://www.baidu.com’
with urllib.request.urlopen(resource) as s:
return s.read().decode(‘utf-8’)

print(get_pep())
print(get_pep.cache_info())

#CacheInfo(hits=0, misses=1, maxsize=32, currsize=1)
#調節性能

**functools.partial(func, *args, keywords)
返回一個新的函數,當被調用時其行爲類似於 func 附帶位置參數 args 和關鍵字參數 keywords 被調用。 如果爲調用提供了更多的參數,它們會被附加到 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 = keywords
return newfunc

1,閉包定義了一個新的函數newfunc,有2個參數簽名fargs和fkeywords。這個newfunc的函數體很簡單,就是把partial函數的參數和newfunc函數的參數合併起來給partial函數的第一個參數func函數執行,返回執行後的結果。
2,把partial函數的參數屬性賦值給newfunc
3,返回newfunc
4,當時實際調用函數的時候相當於已經在原函數上傳入了參數

1,傳送參數進行 和閉包的效果很像
from functools import partial

def add(x, y, z):
print x, y, z
return x + y + z

add1 = partial(add, 10)
print(add1(20, 30))

輸出:
10 20 30
60

2,傳送函數,此時一般用的很少,一般用來給一個函數附上另一種屬性
from functools import partial

def sub(x, y):
return x - y

def div(x, y):
return x/y

def attach_wrap(func1, func2=None):
if func2 is None:
return partial(attach_wrap, func1)
setattr(func1, func2.name, func2)
return func1

sub1 = attach_wrap(sub)
print(sub1)

sub2 = sub1(div)
print(sub2)

print(sub2(20, 10)/10)
print(sub2.div(20, 10)/2)

運行結果:
functools.partial(<function attach_wrap at 0x000000000B134378>, <function sub at 0x000000000B1342F0>)
<function sub at 0x000000000B1342F0>
1.0
1.0

@functools.wraps(wrapped, assigned=WRAPPER_ASSIGNMENTS,updated=WRAPPER_UPDATES)
目前已知的效果是,讓裝飾後的函數,被反射的時候仍然可以獲取本來的名字

… from functools import wraps
… def my_decorator(f):
… @wraps(f)
… def wrapper(*args, **kwds):
… print(‘Calling decorated function’)
… return f(*args, **kwds)
… return wrapper

… @my_decorator
… def example():
… “”“Docstring”""
… print(‘Called example function’)

#example()
Calling decorated function
Called example function
#example.name
‘example’
#example.doc
‘Docstring’

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章