python funtools 模塊常用函數

  • 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
    1. 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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章