類型注解


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無法過期,失效
不支持清除操作
不支持分布式,是一個單機的緩存
使用場景,單機上需要空間換時間的地方,可以用緩存來將計算編程快速的查詢
      


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM