python學習9-裝飾器和類型提升

一裝飾器
參數是一個函數,返回值是一個函數,就可以作爲裝飾器.
常見的使用場景:監控、日誌、緩存、路由、權限、參數檢查、審計
1、類似如下:

import functools
def fn1(fn):
    @functools.wraps(fn)
    def wrap(*arg,**kw):
        print('start')
        ret = fn(*arg,**kw)
        print('stop')
        return ret
    return wrap
@fn1
def fn2(x):
    print(x)

2、帶參數的裝飾器類似如下:

def logger(s,p=lambda name,t:print('call {} took {}'.format(name,t))):
    def _logger(fn):
        @functools.wraps(fn)
        def wrap(*arg,**kw):
            start = datetime.datetime.now()
            ret = fn(*arg,**kw)
            end = datetime.datetime.now()
            if (end - start).total_seconds() > s:
                p(fn.__name__,end-start)
            return ret
        return wrap
    return _logger

@logger(2)
def sleep(x):
    time.sleep(x)

二、類型提升
一個變量的類型,是在運行時決定的
一個變量的類型在應用的生命週期中是可變的
1、->int 只是註釋,不檢查,p3加入

def add(x,y)->int:
    return x + y

三、常用

import functools
newadd = functools.partial(add,y=5) #設定函數默認值
@functools.lru_cache() #按參數緩存,默認爲128條,按照最近最少使用替換,滿足不需要過期、清除、分佈式,無副作用即可使用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章