天天看點

typing 子產品

引入

參考官方文檔 typing 是 3.5 版本的新功能, Python 運作時不強制執行函數和變量類型注解, 但我們寫完代碼一段時間後再回來看我們的代碼, 可能就忘記了自己所寫的函數需要傳什麼參數、傳回什麼類型的結果, 又得去閱讀代碼, 這樣就大大降低了開發的效率, 而 typing 子產品的數顯很好的解決了這個問題

一. typing 的作用

  • 類型檢查,防止運作時出現參數和傳回值類型不符合
  • 作為開發文檔附加說明,友善使用者調用時傳入和傳回參數類型
  • 該子產品加入後并不會影響程式的運作,不會報正式的錯誤,隻有提醒

二. typing 常用的類型

  • int, long, float : 整型, 長整形, 浮點型
  • bool, str : 布爾型, 字元串類型
  • List, Tuple, Dict, Set : 清單, 元組, 字典, 集合
  • Iterable, Iterator : 可疊代類型, 疊代器類型
  • Generator :生成器類型

三. typing 子產品的常用方式

1.簡單的使用方式

def add(name:str,age:int=22)->str:
    return f"名字:{name} 年齡:{age}"

print(add("派大星"))  # 名字:派大星 年齡:22
           

2.類型檢查說明

  • 在傳入參數時通過

    [參數名] : [類型]

    的形式聲明參數的類型
  • 傳回結果通過

    ->[結果類型]

    的形式聲明結果的類型
  • 在調用的時候如果參數的類型不正确pycharm會有提醒,但不會影響程式的運作
  • 對于如 list ,tuple…等,還可以規定得更加具體一些,如:

    -> List[str]

    , 規定傳回的是清單,并且元素是字元串

3.比較複雜一點點的使用方式

from typing import List,Tuple,Dict

def add(name:str,age:int,height:float,sex:bool=True)->Tuple[List,Tuple,Dict,bool]:
    list1 = [name,age,height,sex]
    tuple1 = [1,2,3,4]
    dic1 = {"name":name,"age":age}
    return list1,tuple1,dic1,sex

print(add("派大星",22,1.72,True))
 # (['派大星', 22, 1.72, True], [1, 2, 3, 4], {'name': '派大星', 'age': 22}, True)
           

三,函數注解檢視 __annotation__

函數的注解資訊都儲存在

__annotation__

屬性中, 它是一個字典, 包括傳回值類型聲明

def bar(name:str,age:int)->str:
    return f"名字:{name} 年齡:{age}"

print(bar.__annotations__)
# {'name': <class 'str'>, 'age': <class 'int'>, 'return': <class 'str'>}
           

四.類型别名

把類型賦給别名,就可以定義類型别名, 類型别名适用于簡化複雜的類型簽名

1.簡單類型别名示例

from typing import List

Li = List[str]  # 這裡 Li 和 List[str] 的意義是相同的
def add(name:str,age:int)->Li:
    return [name]

print(add("shawn",22))  # ['shawn'] (清單類型隻支援一個元素, 不然報錯)
           

2.複雜的類型别名示例

from typing import List,Tuple,Dict

People = Tuple[str,int]
Other = Dict[str,int]
Info = Tuple[People,Other]

def add(name:str,info:Info)->None:  # 這種寫法等同于下面的寫法
    ...

def add2(name:str,info:Tuple[Tuple[str,int],Dict[str,int]])->None:
    ...
           

官方文檔 : https://docs.python.org/zh-cn/3/library/typing.html#module-typing