一篇文章帶你了解python中的typing模塊和類型注解
function annotation 寫法:
- 使用冒號(hào)
:
加類型代表參數(shù)類型- 默認(rèn)值參數(shù)示例:
b: int = 2
- 默認(rèn)值參數(shù)示例:
- 使用
->
加類型代表返回值類型
python解釋器運(yùn)行時(shí)并不會(huì)檢查類型,類型不對(duì)也不會(huì)拋異常,僅僅是注解而已。示例:
def plus(a: int, b: int = 2) -> int: return a + b
python 解析器并不會(huì)在意類型注解,嚴(yán)格來(lái)說(shuō)這是不對(duì)的,Python 會(huì)把類型信息放在 __annotations__
屬性中:
>>> def foo(a: str): ... print('hello', a) ... >>> foo.__annotations__ {'a': str} >>> class Bar: ... a: str ... b: int >>> Bar.__annotations__ {'a': str, 'b': int}
typing模塊
內(nèi)置提供的類型:int
、str
、float
,typing模塊提供的類型:Dict
、List
、Tuble
...
typing使用方括號(hào) Dict[str, int]
而不是圓括號(hào) Dict(str, int)
Dict
Dict[str, int]: 表示一個(gè) keys 的類型為 str,values 的類型為 int 的字典,比如 {"a": 1, "b": 2}
from typing import Dict Dict[str, Dict[str, List[str]]]如下: { '原木鎮(zhèn)': { '第一小學(xué)': ['張偉', '王偉', '王芳'], '第二小學(xué)': ['李偉', '李娜'], }, '鴿子鎮(zhèn)': { '高山中學(xué)': ['張敏', '李靜'], '億百中學(xué)': ['王靜'] '蟒蛇小學(xué)': ['劉偉', '王秀英'] } }
List
List[int] 表示由整型組成的列表,比如[0, 1, 1, 2, 3]
List[List[int]] = [[1, 2], [2, 3]]
Tuple
Tuple[int, float, str] is a tuple of an int, a float and a string.
person: Tuple[str, int, float] = ('Mike', 22, 1.75)
set/AbstractSet
根據(jù)官方文檔,Set 推薦用于注解返回類型,AbstractSet 用于注解參數(shù)
def describe(s: AbstractSet[int]) -> Set[int]: return set(s)
Sequence
Sequence,是 collections.abc.Sequence 的泛型,在某些情況下,我們可能并不需要嚴(yán)格區(qū)分一個(gè)變量或參數(shù)到底是列表 list 類型還是元組 tuple 類型,我們可以使用一個(gè)更為泛化的類型,叫做 Sequence,其用法類似于 List
def square(elements: Sequence[float]) -> List[float]: return [x ** 2 for x in elements]
NoReturn
NoReturn,當(dāng)一個(gè)方法沒(méi)有返回結(jié)果時(shí),為了注解它的返回類型,我們可以將其注解為NoReturn
def hello() -> NoReturn: print('hello')
Any
Any,可以代表所有類型,所有的無(wú)參數(shù)類型注解和返回類型注解的都會(huì)默認(rèn)使用 Any 類型,以下兩個(gè)函數(shù)等價(jià):
def add(a): return a + 1 def add(a: Any) -> Any: return a + 1
TypeVar
TypeVar,自定義兼容特定類型的變量,比如有的變量聲明為 int、float、None 都是符合要求的,實(shí)際就是代表任意的數(shù)字或者空內(nèi)容都可以,其他的類型則不可以,比如列表 list、字典 dict 等等,像這樣的情況,我們可以使用 TypeVar 來(lái)表示。
height = 1.75 Height = TypeVar('Height', int, float, None) def get_height() -> Height: return height
NewType
newType,聲明一些具有特殊含義的類型,像 Tuple 的例子一樣,我們需要將它表示為 Person,即一個(gè)人的含義,但但從表面上聲明為 Tuple 并不直觀,所以我們可以使用 NewType 為其聲明一個(gè)類型,如:
Person = NewType('Person', Tuple[str, int, float]) person = Person(('Mike', 22, 1.75))
實(shí)際上 person 就是一個(gè) tuple 類型,我們可以對(duì)其像 tuple 一樣正常操作。
Callable
Callable,可調(diào)用類型,通常用來(lái)注解一個(gè)方法, 在聲明的時(shí)候需要使用 Callable[[Arg1Type, Arg2Type, ...], ReturnType]
這樣的類型注解,將參數(shù)類型和返回值類型都要注解出來(lái),例如:
def date(year: int, month: int, day: int) -> str: return f'{year}-{month}-{day}' def get_date_fn() -> Callable[[int, int, int], str]: return date
-> Callable[[int, int, int], str]: 中括號(hào)內(nèi)分別標(biāo)記了返回的方法的參數(shù)類型和返回值類型。
Union
Union,聯(lián)合類型,Union[X, Y]
代表要么是 X 類型,要么是 Y 類型。
Union[Union[int, str], float] == Union[int, str, float] Union[int] == int Union[int, str, int] == Union[int, str] # 無(wú)參數(shù)順序 Union[int, str] == Union[str, int]
在一些方法參數(shù)聲明的時(shí)候比較有用,比如一個(gè)方法,要么傳一個(gè)字符串表示的方法名,要么直接把方法傳過(guò)來(lái):
def process(fn: Union[str, Callable]): if isinstance(fn, str): # str2fn and process pass elif isinstance(fn, Callable): fn()
這樣的聲明在一些類庫(kù)方法定義的時(shí)候十分常見(jiàn)。
Optional
Optional,意思是說(shuō)這個(gè)參數(shù)可以為空或已經(jīng)聲明的類型,即 Optional[X]
等價(jià)于 Union[X, None]
。
Optional 并不等價(jià)于可選參數(shù),當(dāng)它作為參數(shù)類型注解的時(shí)候,不代表這個(gè)參數(shù)可以不傳遞,而是說(shuō)這個(gè)參數(shù)可以傳None,不傳也會(huì)報(bào)錯(cuò)。
當(dāng)一個(gè)方法執(zhí)行結(jié)果,如果執(zhí)行完畢就不返回錯(cuò)誤信息, 如果發(fā)生問(wèn)題就返回錯(cuò)誤信息,則可以這么聲明:
def judge(result: bool) -> Optional[str]: if result: return 'Error Occurred'
Generator
Generator,想代表一個(gè)生成器類型,可以使用 Generator,它的聲明比較特殊,其后的中括號(hào)緊跟著三個(gè)參數(shù),分別代表 YieldType、SendType、ReturnType,如:
def echo_round() -> Generator[int, float, str]: sent = yield 0 while sent >= 0: sent = yield round(sent) return 'Done'
在這里 yield 關(guān)鍵字后面緊跟的變量的類型就是 YieldType,yield 返回的結(jié)果的類型就是 SendType,最后生成器 return 的內(nèi)容就是 ReturnType。
當(dāng)然很多情況下,生成器往往只需要 yield 內(nèi)容就夠了,我們是不需要 SendType 和 ReturnType 的,可以將其設(shè)置為空,如:
def infinite_stream(start: int) -> Generator[int, None, None]: while True: yield start start += 1
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Python用戶推薦系統(tǒng)曼哈頓算法實(shí)現(xiàn)完整代碼
這篇文章主要介紹了Python用戶推薦系統(tǒng)曼哈頓算法實(shí)現(xiàn)完整代碼,簡(jiǎn)單介紹了曼哈頓距離的定義,然后分享了其Python實(shí)現(xiàn)代碼,具有一定借鑒價(jià)值,需要的朋友可以了解下。2017-12-12python 通過(guò)麥克風(fēng)錄音 生成wav文件的方法
今天小編就為大家分享一篇python 通過(guò)麥克風(fēng)錄音 生成wav文件的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Python xlwings插入Excel圖片的實(shí)現(xiàn)方法
這篇文章主要介紹了Python xlwings插入Excel圖片的實(shí)現(xiàn)方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-02-02Python通用驗(yàn)證碼識(shí)別OCR庫(kù)ddddocr的安裝使用教程
dddd_ocr是一個(gè)用于識(shí)別驗(yàn)證碼的開(kāi)源庫(kù),又名帶帶弟弟ocr,下面這篇文章主要給大家介紹了關(guān)于Python通用驗(yàn)證碼識(shí)別OCR庫(kù)ddddocr的安裝使用教程,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07通過(guò)Python繪制中國(guó)結(jié)的示例代碼
再過(guò)不久就要到新年了,所以這篇文章將為大家介紹一下如何通過(guò)Python代碼繪制一個(gè)中國(guó)結(jié),文中的示例代碼講解詳細(xì),感興趣的可以動(dòng)手試一試2022-01-01Django實(shí)現(xiàn)全文檢索的方法(支持中文)
這篇文章主要介紹了Django實(shí)現(xiàn)全文檢索的方法(支持中文),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05python+ollama自己寫代碼調(diào)用本地deepseek模型
本文主要介紹了python+ollama自己寫代碼調(diào)用本地deepseek模型,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2025-03-03基于Python pip用國(guó)內(nèi)鏡像下載的方法
今天小編就為大家分享一篇基于Python pip用國(guó)內(nèi)鏡像下載的方法。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06利用Python快速搭建Markdown筆記發(fā)布系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了使用Python生態(tài)的成熟工具,在30分鐘內(nèi)搭建一個(gè)支持Markdown渲染、分類標(biāo)簽、全文搜索的私有化知識(shí)發(fā)布系統(tǒng),感興趣的小伙伴可以參考下2025-04-04