python類型注解:
python是動態語言,變量隨時可以被賦值,且能賦值為不同的類型
python不是靜態語言,變量類型在運行時才決定
動態語言弊端:
難發現,難使用;不做任何類型檢查,只會在運行時才暴露出問題,函數的使用者看到時並不知道你的函數的設計,不知道該傳入什么類型的數據
關於弊端解決的辦法:
1.增加文檔,這是一個慣例,不是強制標准,需要注意的是,函數定義更新了,文檔未必同步更新
2.利用函數注解:
在3.5以后的版本才引入使用,
對函數的參數進行注解
對函數的返回值進行類型注解
支隊函數參數做一個輔助的說明,並不對函數參數進行類型檢查
提供第三方工具,做代碼分析,發現隱藏的bug
函數注解的信息,保存在__annotations__
調用類方法: 函數.__annotations__
變量注解,在3.6后引入: i: int = 3
業務應用:
函數類型檢查
思路,
函數參數的檢查一定實在函數外
檢查函數(實際應用參數):
利用形參定義與實際應用參數的類型進行比較
.__annotations__屬性是一個字典,其中包括返回值類型的聲明,幾級啊折要做位置參數的判斷,無法與字典中的聲明對應,可使用inspect模塊
inspect模塊:
提供獲取對象新的函數,可以檢查函數和類,類型檢查
signature(callable) 獲取簽名,(函數簽名包含了一個
函數的信息,它包括函數名、他的參數類型、他所在的類和名稱空間及其他信息)
import inspect def add (x:int,y:int,*args,**kwargs)->int: #定義函數參數的注解 return x+y print(add.__annotations__) #查看add函數定義類型 sig=inspect.signature(add) #函數的定義(簽名) print(sig) #查看add函數的簽名(聲明) print('params:',sig.parameters) #有序字典(有序的參數列表) print('return:',sig.return_annotation) #查看返回值的定義類型 print(sig.parameters['y']) #查看參數y的參數注解 print(sig.parameters['x'].annotation) #查看參數y的定義類型 print(sig.parameters['args']) #查看參數args的參數注解 print(sig.parameters['args'].annotation) #查看參數args的參數定義類型 print(sig.parameters['kwargs']) #查看kwargs的參數注解 print(sig.parameters['kwargs'].annotation) #查看kwargs的參數定義類型
使用inspect模塊對一個函數進行判斷: inspect.isfunction(func):是否是函數 inspect.ismethod(func):是否是類的方法 inspect.isgenerator(func):是否是生成器對象 inspect.isgeneratorfunction(func):是否是生成器函數 inspect.isclass(func) :是否是類 inspect.ismodule(模塊):是否是模塊 inspect.isbuiltin(print):是否是內建對象 is函數可通過查閱iinspect模塊查看更多使用幫助
Parameter對象:(有序字典)
保存在
元組中,是只讀的
name,參數的名字 annotation,參數的注解,可能未定義 default, 參數的缺省值,可能未定義 empty , 特殊的類,用來標記default屬性或者注釋annotation屬性的空值 kind 實參如何綁定到形參,就是形參的類型 POSITIONAL_ONLY,值必須是位置參數提供(python未實現) POSITIONAL_OR_KEYWORD,值可以作為關鍵字或者位置參數提供 VAR_POSITIONAL 可變位置參數,對應*args KEYWORD-ONLY keyword-only參數,對應*或者*args之后的出現非可變關鍵之參數 VAR_KEYWORD,可變關鍵字參數,對應**kwargs
partial
偏函數,把函數部分的參數固定下來,相當於為部分的參數添加了一個固定的默認值,形成了一個新的函數並返回
從partial生成的新函數,是對原函數的封裝
lru_cache(maxsize=128,typed=Flase)
least-recently-used裝飾器,lru,最近最少使用,cache緩存
如果maxsize設置為None,則禁用LRU功能,並且緩存可以無限制增長,當max是二的冪時,LRU功能執行的最好
如果typed設置為True,則不同類型的函數參數將單獨緩存,例如f(3),f(3.0)將被視為具有不同結果的不同調用
lru_cache裝飾器作用
使用前提:
同樣的函數參數一定得到同樣的結果
函數執行時間很長,且要執行多次執行
本質是函數調用的參數=>返回值
缺點:
不支持緩存過期,key無法過期,失效
不支持清除操作
不支持分布式,是一個單機的緩存
使用場景,單機上需要空間換時間的地方,可以用緩存來將計算編程快速的查詢