深入了解Python中的變量類型標(biāo)注
一、概述
1、描述
變量類型注解是用來(lái)對(duì)變量和函數(shù)的參數(shù)返回值類型做注解,讓調(diào)用方減少類型方面的錯(cuò)誤,也可以提高代碼的可讀性和易用性。
但是,變量類型注解語(yǔ)法傳入的類型表述能力有限,不能說(shuō)明復(fù)雜的類型組成情況,因此引用了typing模塊,來(lái)實(shí)現(xiàn)復(fù)雜的類型表達(dá)。
2、常用的數(shù)據(jù)類型
Type | Description |
---|---|
int | 整型 integer |
float | 浮點(diǎn)數(shù)字 |
bool | 布爾(int 的子類) |
str | 字符 (unicode) |
bytes | 8 位字符 |
object | 任意對(duì)象(公共基類) |
List[str] | 字符組成的列表 |
Tuple[int, int] | 兩個(gè)int對(duì)象的元組 |
Tuple[int, ...] | 任意數(shù)量的 int 對(duì)象的元組 |
Dict[str, int] | 鍵是 str 值是 int 的字典 |
Iterable[int] | 包含 int 的可迭代對(duì)象 |
Sequence[bool] | 布爾值序列(只讀) |
Mapping[str, int] | 從 str 鍵到 int 值的映射(只讀) |
Any | 具有任意類型的動(dòng)態(tài)類型值 |
Union | 聯(lián)合類型 |
Optional | 參數(shù)可以為空或已經(jīng)聲明的類型 |
Mapping | 映射,是 collections.abc.Mapping 的泛型 |
MutableMapping | Mapping 對(duì)象的子類,可變 |
Generator | 生成器類型, Generator[YieldType、SendType、ReturnType] |
NoReturn | 函數(shù)沒(méi)有返回結(jié)果 |
Set | 集合 set 的泛型, 推薦用于注解返回類型 |
AbstractSet | collections.abc.Set 的泛型,推薦用于注解參數(shù) |
Sequence | collections.abc.Sequence 的泛型,list、tuple 等的泛化類型 |
TypeVar | 自定義兼容特定類型的變量 |
Generic | 自定義泛型類型 |
NewType | 聲明一些具有特殊含義的類型 |
Callable | 可調(diào)用類型, Callable[[參數(shù)類型], 返回類型] |
NoReturn | 沒(méi)法返回值 |
3、mypy模塊
mypy是Python的可選靜態(tài)類型檢查器
安裝mypy模塊 pip3 install mypy
使用mypy進(jìn)行靜態(tài)類型檢查 mypy 執(zhí)行 python 文件
二、使用
1、基本使用
from typing import List, Set, Dict, Tuple #對(duì)于簡(jiǎn)單的 Python 內(nèi)置類型,只需使用類型的名稱 x1: int = 1 x2: float = 1.0 x3: bool = True x4: str = "test" x5: bytes = b"test" # 對(duì)于 collections ,類型名稱用大寫字母表示,并且 # collections 內(nèi)類型的名稱在方括號(hào)中 x6: List[int] = [1] x7: Set[int] = {6, 7} #對(duì)于映射,需要鍵和值的類型 x8: Dict[str, float] = {'field': 2.0} #對(duì)于固定大小的元祖,指定所有元素的類型 x9: Tuple[int, str, float] = (3, "yes", 7.5) #對(duì)于可變大小的元祖,使用一種類型和省略號(hào) x10: Tuple[int, ...] = (1, 2, 3) '''在終端執(zhí)行檢查 (venv) D:\python>mypy .\01.py Success: no issues found in 1 source file '''
2、函數(shù)參數(shù)返回值添加類型標(biāo)注
1. 指定多個(gè)參數(shù)的方式
''' 定義一個(gè)函數(shù) 參數(shù) num int類型 返回值 字符串類型 使用mypy檢測(cè) ''' def num_fun(num: int) -> str: return str(num) num_fun(100) print(num_fun(100)) # 指定多個(gè)參數(shù)的方式 def plus(num1: int, num2: int) -> int: return num1 + num2 # 在類型注釋后為參數(shù)添加默認(rèn)值,默認(rèn)值需要添加在末尾 ''' 聲明函數(shù)參數(shù)時(shí),所有帶有默認(rèn)值的參數(shù)必須放在非默認(rèn)參數(shù)的后面。 這是因?yàn)?Python 解釋器需要確定參數(shù)傳遞的順序, 如果默認(rèn)參數(shù)放在非默認(rèn)參數(shù)前面,解釋器就無(wú)法確定哪個(gè)參數(shù)是哪個(gè) ''' def func1(num1: int, my_float: float = 3.5)-> float: return num1 + my_float print(func1(10,20)) f = func1 print(f(10))
2. Callable
Callable 是一個(gè)抽象類,用于描述可調(diào)用對(duì)象的基本行為,例如函數(shù)、方法和類。當(dāng)你聲明一個(gè)函數(shù)變量并將其分配給一個(gè)變量時(shí),這個(gè)變量只是一個(gè)普通的 Python 對(duì)象,并不是一個(gè)可調(diào)用對(duì)象,因此它沒(méi)有默認(rèn)值
帶有默認(rèn)值的參數(shù)可以放在任何位置,但是在聲明函數(shù)參數(shù)時(shí),所有帶有默認(rèn)值的參數(shù)必須放在非默認(rèn)參數(shù)的后面。這是因?yàn)?Python 解釋器需要確定參數(shù)傳遞的順序,如果默認(rèn)參數(shù)放在非默認(rèn)參數(shù)前面,解釋器就無(wú)法確定哪個(gè)參數(shù)是哪個(gè)。
from typing import Callable #定義變量 指向一個(gè)函數(shù) def func2(num1:int, my_float=3.5) -> str: return f'返回結(jié)果{num1 + my_float}' print(func2(10)) #Callable指向可調(diào)用(函數(shù))值的方式 x: Callable[[int, float], str] = func2 print(x(10, 3.5)) ''' 執(zhí)行結(jié)果 返回結(jié)果13.5 返回結(jié)果13.5 '''
3. Iterator
#定義函數(shù),產(chǎn)生整數(shù)的生成器,每次返回一個(gè) from typing import Iterator # 產(chǎn)生整數(shù)的生成器函數(shù)安全地返回只是一個(gè) 整數(shù)迭代器的函數(shù) #,因此這就是我們對(duì)其進(jìn)行注釋的方式 def g(n: int) -> Iterator[int]: i = 0 while i < n: yield i #下次迭代時(shí),代碼從 yield 的下一條語(yǔ)句(不是下一行)開(kāi)始執(zhí)行 i += 1 print(g(10)) for i in g(10): print(i) '''執(zhí)行結(jié)果 <generator object g at 0x00000000014E88E0> 0 1 2 3 4 5 6 7 8 9 '''
3、混合類型檢查改進(jìn)
1.聯(lián)合運(yùn)算符
聯(lián)合運(yùn)算符使用 " | " 線來(lái)替代了舊版本中Union[] 方法,使得程序更簡(jiǎn)潔
#新版本 def get_name(user: str | dict) -> str: if isinstance(user, str): return user elif isinstance(user, dict): return user.get('name', '') print(get_name({'name':'Bob'})) print(get_name("Alice"))
在這個(gè)例子中,函數(shù)get_name接受一個(gè)參數(shù)user,它可以是一個(gè)字符串或一個(gè)字典。如果user是一個(gè)字符串,函數(shù)會(huì)直接返回這個(gè)字符串;如果user是一個(gè)字典,函數(shù)會(huì)嘗試從字典中獲取name字段的值,并返回它。
在這個(gè)例子中,我們使用聯(lián)合運(yùn)算符將str和dict類型組合起來(lái),表示user可以是這兩種類型之一。
#舊版本,Union方法來(lái)實(shí)現(xiàn)相同的功能 from typing import Union def get_name2(user: Union[str, dict]) -> str: if isinstance(user, str): return user elif isinstance(user, dict): return user.get('name', '') print(get_name2({'name':'Bob'})) print(get_name2("Alice")) '''執(zhí)行結(jié)果 Bob Alice '''
4、類型別名更改
#舊版本 oldname = str def oldFunc(param:oldname) -> oldname: return param + param oldFunc('oldFunc:花非人陌') #新版本,從3.10后開(kāi)始支持 from typing import TypeAlias newstr :TypeAlias = str #定義類型別名 newint :TypeAlias = int def func_test(num:newint, msg:newstr)->newstr: return str(num) + msg print(func_test(100,"類型名稱更改"))
到此這篇關(guān)于深入了解Python中的變量類型標(biāo)注的文章就介紹到這了,更多相關(guān)Python變量類型標(biāo)注內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pandas的to_datetime時(shí)間轉(zhuǎn)換使用及學(xué)習(xí)心得
這篇文章主要給大家介紹了關(guān)于pandas的to_datetime時(shí)間轉(zhuǎn)換使用及學(xué)習(xí)心得的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用pandas具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Python采集貓眼兩萬(wàn)條數(shù)據(jù) 對(duì)《無(wú)名之輩》影評(píng)進(jìn)行分析
這篇文章主要給大家介紹了關(guān)于利用Python榮國(guó)采集兩萬(wàn)條貓眼數(shù)據(jù),對(duì)《無(wú)名之輩》影評(píng)進(jìn)行分析的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12Python將一個(gè)Excel拆分為多個(gè)Excel
這篇文章主要為大家詳細(xì)介紹了Python將一個(gè)Excel拆分為多個(gè)Excel,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11使用sklearn進(jìn)行對(duì)數(shù)據(jù)標(biāo)準(zhǔn)化、歸一化以及將數(shù)據(jù)還原的方法
今天小編就為大家分享一篇使用sklearn進(jìn)行對(duì)數(shù)據(jù)標(biāo)準(zhǔn)化、歸一化以及將數(shù)據(jù)還原的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07python數(shù)據(jù)庫(kù)編程 ODBC方式實(shí)現(xiàn)通訊錄
這篇文章主要為大家詳細(xì)介紹了python數(shù)據(jù)庫(kù)編程,ODBC方式實(shí)現(xiàn)通訊錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03解決Pytorch自定義層出現(xiàn)多Variable共享內(nèi)存錯(cuò)誤問(wèn)題
這篇文章主要介紹了解決Pytorch自定義層出現(xiàn)多Variable共享內(nèi)存錯(cuò)誤問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-06-06Pycharm搭建Django項(xiàng)目詳細(xì)教程(看完這一篇就夠了)
這篇文章主要給大家介紹了關(guān)于Pycharm搭建Django項(xiàng)目的詳細(xì)教程,想要學(xué)習(xí)的小伙伴看完這一篇就夠了,pycharm是一種Python?IDE,帶有一整套可以幫助用戶在使用Python語(yǔ)言開(kāi)發(fā)時(shí)提高其效率的工具,需要的朋友可以參考下2023-11-11Python?自動(dòng)控制原理?control的詳細(xì)解說(shuō)
這篇文章主要介紹了Python自動(dòng)控制原理control的詳細(xì)解說(shuō),文章圍繞主題展開(kāi)對(duì)Python?control的介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-07-07python中pd.cut()與pd.qcut()的對(duì)比及示例
本文主要介紹了python中pd.cut()與pd.qcut()的對(duì)比及示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-06-06