溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

緩存裝飾器的應用習題練習

發布時間:2020-03-15 16:28:02 來源:網絡 閱讀:395 作者:wx59250b0388f14 欄目:編程語言

import datetime

import inspect

from  inspect import signature,Parameter

def decrode_cache(fn):

    ##只是裝飾器開始的時間

    local_cache={}

    def wrapper(*agrs, **kwargs):

        clear_list= []

        for k,(_,stamp) in local_cache.items():  ##此處意思是說 每次只要函數一調用一進來先遍歷一次看看之前local_dict的時間戳,在和現在的進行比較

            star = datetime.datetime.now().timestamp()

        #如果已存在的時間戳和現在比較大于五秒,則清楚緩存(清楚緩存要明確清楚的是字典的key,values值,它是緩存)。

            if star - stamp >5:

                clear_list.append(k)

        for k in clear_list: #這里有一個知識點要注意 字典在遍歷的過程中不能移除內容,有需要移除的可以先把他們存在列表里,然后在遍歷列表pop字典的值

            local_cache.pop(k)

        paramers_dict = {} #構建一個裝參數的空字典

    ##考慮 agrs 傳參 要求 從參數字典中提取的name = args(按順序等于) 組成一個k,v字典傳給paramers_dict

        sig = inspect.signature(fn)

        parameters = sig._parameters #OrderedDict([('x', <Parameter "x=1">), ('y', <Parameter "y=2">)])

    #從參數字典中提取的name = args(按順序等于) 組成一個k,v字典

        params_name = [key for key in parameters.keys()]

        for i,values in enumerate(agrs):

            k = params_name[i]

            paramers_dict[k] = values

    #kwargs 所有值update 到參數字典中

        for k,v in kwargs.items():

            paramers_dict[k] = v

    #缺省值傳參方式 add() 如果用缺省值則args kwargs都是空的 那就要把signatue.Paramers字典中的缺省值拿出來加到參數字典中來

        for k,v in parameters.items():

            if k not in parameters.keys():

                parameters[k]= v.default

    #三種情況都考慮周全后,該考慮排序問題 也就是要求的 add(x=3,y=4) 和 add(y=4,x=3)的問題

        new_paramers_dict = tuple(sorted(parameters)) #變成tuple的原因一方面是不可變位置,另一方面是需要把這個值緩存到本地字典中作為key,key必須是不可hash的值所以只能用元祖包裝

        if new_paramers_dict  not in local_cache.keys(): ##所有的參數字典都搞定以后就要進行緩存了,緩存其實就是把參數字典寫到本地字典中去,第二次輸入相同的參數就可以在本地中直接取結果,如果是第一次創建沒在本地中就寫入。


            local_cache[new_paramers_dict] = (fn(*agrs,**kwargs),datetime.datetime.now().timestamp()) ##返回的是參數的解構 構造的是一個{("x"=3,"y"=4):7}的一個字典 前部分是key 是個元祖解構很少見要注意

        return local_cache[new_paramers_dict] ### 此處是k,v對創建的時間 也就是函數生成的時間,給此處打一個時間戳,記錄他的生命周期的開始,函數再次輸入時,這就是成為了過去式。(記住此處的巧妙用法,把時間付給values)

    return wrapper

import time

@decrode_cache

def add(x=1,y=2):# args(1,2) kwargs(x=1,x=2) default=()

    time.sleep(3)

    return x+y


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女