Python 中的 typing 模塊常見用法
typing
模塊是 Python 提供的一個(gè)標(biāo)準(zhǔn)庫,主要用于為函數(shù)、變量和類定義類型提示(Type Hints),從而提高代碼的可讀性和類型安全性。雖然 Python 是動態(tài)類型語言,但通過 typing
模塊,開發(fā)者可以明確指定變量和函數(shù)的參數(shù)、返回值的類型,幫助 IDE 或靜態(tài)代碼分析工具提供更好的代碼提示和錯(cuò)誤檢查。雖然 Python 本身不會強(qiáng)制執(zhí)行這些類型檢查,但借助 mypy 等工具,可以進(jìn)行靜態(tài)類型分析,幫助發(fā)現(xiàn)潛在問題。
源碼位置:D:\Python310\Lib\typing.py
一.常見類型提示
1.List 和 Dict
用于表示列表和字典類型。
(1)List[type]
表示一個(gè)包含特定類型元素的列表。
(2)Dict[key_type, value_type]
表示鍵和值有特定類型的字典。
2.Tuple
表示一個(gè)包含特定類型的元組。Tuple[type1, type2]
表示一個(gè)包含兩個(gè)特定類型的元組。
3.Optional
表示變量可以是某種類型,也可以是 None
。Optional[type]
等價(jià)于 Union[type, None]
,表示某個(gè)值可以是 type
或 None
。
4.Union
表示一個(gè)變量可以是多個(gè)類型之一。Union[type1, type2, ...]
表示變量可以是 type1
、type2
等中的任意一種。
5.Any
表示可以是任意類型。Any
用于聲明一個(gè)變量可以是任意類型,不做類型檢查。
6.Callable
表示可調(diào)用的對象,如函數(shù)。Callable[[arg_type1, arg_type2], return_type]
用于表示一個(gè)函數(shù),參數(shù)類型為 arg_type1
、arg_type2
,返回值類型為 return_type
。
7.TypeVar
用于定義泛型。TypeVar
用于創(chuàng)建通用函數(shù)或類。
8.Literal
限制變量值為某些特定的值。
9.Set
表示一個(gè)包含特定類型元素的集合。比如 Set[str]
表示一個(gè)字符串集合。
10.FrozenSet
表示一個(gè)不可變的集合。比如 FrozenSet[int]
表示一個(gè)不可變的整數(shù)集合。
11.Generic
用于創(chuàng)建泛型類和泛型接口。比如 class MyList(Generic[T]) 表示一個(gè)泛型列表類,可以存儲類型 T 的元素。
12.Type
表示一個(gè)類型對象。比如 Type[str]
表示 str
類型。
二.常見用法
1.List|Dict|Tuple示例
from typing import List, Dict, Tuple # 一個(gè)返回包含字符串的列表的函數(shù) def get_names() -> List[str]: return ["Alice", "Bob", "Charlie"] # 一個(gè)帶有字典類型提示的函數(shù) def get_person_data() -> Dict[str, int]: return {"Alice": 30, "Bob": 25} # 一個(gè)帶有元組類型提示的函數(shù) def get_coordinates() -> Tuple[int, int]: return (10, 20)
get_names()
:返回一個(gè)List[str]
,即一個(gè)字符串列表。get_person_data()
:返回一個(gè)Dict[str, int]
,表示字典的鍵是字符串,值是整數(shù)。get_coordinates()
:返回一個(gè)Tuple[int, int]
,即一個(gè)包含兩個(gè)整數(shù)的元組。
2.Optional 示例
from typing import Optional def find_user(user_id: int) -> Optional[str]: if user_id == 1: return "Alice" return None
find_user()
:返回類型是 Optional[str]
,表示可能返回字符串,或者返回 None
。
3.Union 示例
from typing import Union def process_input(data: Union[int, str]) -> str: if isinstance(data, int): return f"Received an integer: {data}" return f"Received a string: {data}"
process_input()
:參數(shù)類型是 Union[int, str]
,表示該函數(shù)接收整數(shù)或字符串兩種類型。
4.Callable 示例
from typing import Callable # 定義一個(gè)函數(shù)接收另一個(gè)函數(shù)作為參數(shù) def execute_task(task: Callable[[int, int], int], a: int, b: int) -> int: return task(a, b) # 示例調(diào)用 def add(x: int, y: int) -> int: return x + y result = execute_task(add, 3, 4) # 返回 7
execute_task()
:接收一個(gè)可調(diào)用對象(函數(shù)),該對象接收兩個(gè)整數(shù)并返回一個(gè)整數(shù)。
5.TypeVar 泛型示例
from typing import TypeVar, List T = TypeVar('T') def get_first_element(lst: List[T]) -> T: return lst[0] # 使用時(shí)可以是不同的類型 print(get_first_element([1, 2, 3])) # 返回 1 print(get_first_element(['a', 'b', 'c'])) # 返回 'a'
TypeVar
:允許定義一個(gè)泛型函數(shù) get_first_element
,它可以適用于任何類型的列表。
三.高級用法
1.Literal 示例
from typing import Literal def set_mode(mode: Literal['read', 'write']) -> None: if mode == 'read': print("Setting mode to read") elif mode == 'write': print("Setting mode to write") set_mode('read') # 合法 set_mode('write') # 合法 set_mode('delete') # 非法,會被靜態(tài)分析工具標(biāo)記為錯(cuò)誤
Literal
:限制傳入的值必須是特定的字面值,在此例中只能是 'read'
或 'write'
。
2.TypedDict示例
from typing import TypedDict class User(TypedDict): name: str age: int def get_user() -> User: return {"name": "Alice", "age": 30}
TypedDict
:用于定義字典的具體結(jié)構(gòu),使字典的鍵和值類型更加明確。
3.Protocol示例
用于定義接口協(xié)議,可以檢查對象是否實(shí)現(xiàn)了特定的方法和屬性。
from typing import Protocol class Drawable(Protocol): def draw(self) -> None: ...
4.Final 示例
表示一個(gè)變量、方法或?qū)傩圆荒鼙恢貙懟蛐薷摹?/p>
from typing import Final MAX_SIZE: Final = 100
5.ClassVar 示例
表示一個(gè)類變量,它不應(yīng)被視為實(shí)例變量的一部分。
from typing import ClassVar class MyClass: class_var: ClassVar[int] = 42
6.NoReturn
表示函數(shù)不會返回任何值(通常用于函數(shù)拋出異常的情況)。
from typing import NoReturn def terminate() -> NoReturn: raise SystemExit
參考文獻(xiàn)
[1] typing 對類型提示的支持:https://docs.python.org/zh-cn/3/library/typing.html
[2] https://github.com/python/mypy
[3] https://www.mypy-lang.org/
到此這篇關(guān)于Python 中的 typing 模塊常見用法的文章就介紹到這了,更多相關(guān)Python typing 模塊用法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python scrapy框架中Request對象和Response對象的介紹
本文介紹了python基礎(chǔ)之scrapy框架中Request對象和Response對象的介紹,Request對象主要是用來請求數(shù)據(jù),爬取一頁的數(shù)據(jù)重新發(fā)送一個(gè)請求的時(shí)候調(diào)用,Response對象一般是由scrapy給你自動構(gòu)建的,因此開發(fā)者不需要關(guān)心如何創(chuàng)建Response對象,下面來一起來了解更多內(nèi)容吧2022-02-02python抓取京東商城手機(jī)列表url實(shí)例代碼
python抓取京東商城手機(jī)列表url實(shí)例分享,大家參考使用吧2013-12-12Python實(shí)現(xiàn)CAN報(bào)文轉(zhuǎn)換工具教程
這篇文章主要介紹了Python實(shí)現(xiàn)CAN報(bào)文轉(zhuǎn)換工具教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05python實(shí)現(xiàn)淘寶購物系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)簡易的淘寶購物系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10Python安裝xarray庫讀取.nc文件的詳細(xì)步驟
大家應(yīng)該都知道庫xarray可以幫我們讀取出nc文件的內(nèi)容,所以下面這篇文章主要給大家介紹了關(guān)于Python安裝xarray讀取.nc文件的詳細(xì)步驟,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07Python線性網(wǎng)絡(luò)實(shí)現(xiàn)分類糖尿病病例
什么是線性規(guī)劃?想象一下,您有一個(gè)線性方程組和不等式系統(tǒng)。這樣的系統(tǒng)通常有許多可能的解決方案。線性規(guī)劃是一組數(shù)學(xué)和計(jì)算工具,可讓您找到該系統(tǒng)的特定解,該解對應(yīng)于某些其他線性函數(shù)的最大值或最小值2022-10-10