由於python是個動態類型語言,變量是什麼類型是在變量運行的時候決定的,與他人合作或者代碼躲多起來之後會變得難以閱讀與調試,python3.5以上引入了type hint(類型提示)
舉個例子 比如有一個專門計算整型的加法函數如下
def add(a,b):
return a+b
add(1,2)
光看這個add函數我們並不知道函數的參數類型和返回值類型是啥
但是使用type hint 之後
def add(a:int,b:int)->int:
return a+b
這樣做有幾個好處
函數作者和調用者一眼能看出是什麼參數類型和返回值類型
輸入錯誤的類型之後,ide會高亮顯示提醒作者輸入的類型錯誤
如下圖所示
def my_sum(d: dict[str, int]) -> int:
total = 0
for i in d.values():
total += i
return total
my_sum({"a": 2, "b": 3})
使用如下
class Test:
name = "phil"
def get_name(a: Test) -> str:
return a.name
print(get_name(Test()))
如果在get_name函數中傳Test就會報錯
get_name(Test)
意思是期望傳一個 類型為Test的參數,現在得到一個類型為Test
解釋一下:比如傳一個int類型的參數為3,現在直接傳的是 int
這是一個求列表內元素總和的函數 在入參[1, 2, “3”]加入了個str 這樣是不能求和的 但是沒有任何提示
def my_sum(my_list: list)->int:
sum = 0
for i in my_list:
sum += i
return sum
print(sum([1, 2, "3"]))
無提示 如下圖 因為只檢查了最外層是list沒有檢查內層的每個元素
這樣寫就可以了
但是還是沒有提示 可以安裝三方庫 mypy ,然後使用mypy xx.py進行靜態檢查
想傳list也想傳tuple 可以使用Sequence 支持列表,元組,字節,range
from typing import Sequence
def my_sum(my_list: Sequence[int]) -> int:
total = 0
for i in my_list:
total += i
return total
my_sum([1, 2, 3])
my_sum((1, 2, 3))
my_sum(b"123")
my_sum(range(3))
如果一個參數有可能傳int也有可能傳None,那麼可以使用union
from typing import Union
def func(a: Union[int, None]):
if a is None:
return 0
return a
func(None)
func(1)
也可以使用Optional是一樣的效果
from typing import Optional
def func(a: Optional[int]):
if a is None:
return 0
return a
func(None)
func(1)
必須就得是這個樣子 規定輸入什麼 就得輸入什麼
from typing import Literal
class Person:
def __init__(self, name, gender: Literal["male", "female"]):
self.name = name
self.gender = gender
b = Person("phil", "male")
a = Person("phil", "男")
如果在實例化的時候輸入 a = Person(“phil”, “男”) 就會有如下提示
noreturn是真的沒有返回值,如報錯了
from typing import NoReturn
def error() -> NoReturn:
raise KeyError
目前默認的就是Any,什麼類型都可以 如果確認返回的不是None但是沒有想好返回什麼類型就是用Any
from typing import Any
def fun(a) -> Any:
pass