程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python type hint

編輯:Python

python type hint

入門

初步使用

由於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

這樣做有幾個好處

  1. 函數作者和調用者一眼能看出是什麼參數類型和返回值類型

  2. 輸入錯誤的類型之後,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進行靜態檢查

Sequence

想傳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))

Union、Optional

如果一個參數有可能傳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)

Literal

必須就得是這個樣子 規定輸入什麼 就得輸入什麼

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

noreturn是真的沒有返回值,如報錯了

from typing import NoReturn
def error() -> NoReturn:
raise KeyError

Any

目前默認的就是Any,什麼類型都可以 如果確認返回的不是None但是沒有想好返回什麼類型就是用Any

from typing import Any
def fun(a) -> Any:
pass

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved