- 1、partial(func [,* args] [,** keywords])
對函數局部進行控制,這個局部最常見的就是對參數的控制
from functools import partial
def run(name, age):
print(name, age)
run2 = partial(run, age=18)
run2("laowang")
輸出:
laowang, 18
- 2、update_wrapper(wrapper, wrapped[, assigned][, updated])
主要用途是裝飾器函數,它包裝裝飾函數並返回包裝函數的函數定義而不是原始函數定義
from functools import update_wrapper
def wrap_run(func):
def run(*args, **kwargs):
print('run')
return func(*args, **kwargs)
return update_wrapper(run, func)
@wrap_run
def run2():
print('run2')
輸出:
run
run2
- 3、functool.wraps(wrapped[, assigned][, updated])
調用函數裝飾器 partial(update_wrapper, wrapped=wrapped, assigned=assigned, updated=updated) 的簡寫
from functools import wraps
def wrap_run(func):
@wraps(func)
def run(*args, **kwargs):
print('run')
return func(*args, **kwargs)
return run
@wrap_run
def run2():
print('run2')
run2()
輸出:
run
run2
- 4.partialmethod(func, *args, **keywords)
Python 3.4 中新引入,和partial類似,不過只作用於方法
from functools import partialmethod
class Cell(object):
def __init__(self):
self._alive = False
@property
def alive(self):
return self._alive
def set_state(self, state):
self._alive = state
set_alive = partialmethod(set_state, True)
set_dead = partialmethod(set_state, False)
c = Cell()
print(c.alive)
c.set_alive()
print(c.alive)
c.set_dead()
print(c.alive)
輸出:
False
True
False
- singledispatch
定義泛型函數,調度發生在第一個參數的類型上,
對於使用類型註釋的函數,裝飾器將自動推斷第一個參數的類型
from functools import singledispatch
@singledispatch
def func(*args, **kwargs):
pass
@func.register(float)
@func.register(int)
def _(arg, verbose=False):
if verbose:
print("numbers, eh?", end=" ")
print(arg)
@func.register(str)
def _(arg, verbose=False):
if verbose:
print("str, eh?", end=" ")
print(arg)
func(121, verbose=True)
func(121.1212, verbose=True)
func('aaaaa', verbose=True)
print(func.registry.keys())
輸出:
numbers, eh? 121
numbers, eh? 121.1212
str, eh? aaaaa
dict_keys([<class 'int'>, <class 'str'>, <class 'object'>, <class 'float'>])
- 6.lru_cache(maxsize = 128,typed = False
lru 即:least recently used
如果將maxsize設置爲None,則禁用LRU功能,並且緩存可以無限制地增長。當maxsize是2的冪時,LRU功能表現最佳。
如果typed設置爲true,則將分別緩存不同類型的函數參數。例如,f(3)並且f(3.0)將被視爲產生截然不同的結果不同的呼叫。
爲了幫助測量緩存的有效性並調整maxsize 參數,包裝函數使用一個cache_info() 函數進行檢測,該函數返回一個命名元組,顯示hits,misses, maxsize和currsize。
裝飾器還提供cache_clear()清除或使緩存無效的功能。
from functools import lru_cache
@lru_cache(maxsize=None)
def fib(n):
if n < 2:
return n
return fib(n-1) + fib(n-2)
print([fib(n) for n in range(16)])
print(fib.cache_info())
輸出:
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610]
CacheInfo(hits=28, misses=16, maxsize=None, currsize=16)