Python 中的 typing 模塊常見用法
typing 模塊是 Python 提供的一個標準庫,主要用于為函數(shù)、變量和類定義類型提示(Type Hints),從而提高代碼的可讀性和類型安全性。雖然 Python 是動態(tài)類型語言,但通過 typing 模塊,開發(fā)者可以明確指定變量和函數(shù)的參數(shù)、返回值的類型,幫助 IDE 或靜態(tài)代碼分析工具提供更好的代碼提示和錯誤檢查。雖然 Python 本身不會強制執(zhí)行這些類型檢查,但借助 mypy 等工具,可以進行靜態(tài)類型分析,幫助發(fā)現(xiàn)潛在問題。
源碼位置:D:\Python310\Lib\typing.py

一.常見類型提示
1.List 和 Dict
用于表示列表和字典類型。
(1)List[type] 表示一個包含特定類型元素的列表。
(2)Dict[key_type, value_type] 表示鍵和值有特定類型的字典。
2.Tuple
表示一個包含特定類型的元組。Tuple[type1, type2] 表示一個包含兩個特定類型的元組。
3.Optional
表示變量可以是某種類型,也可以是 None。Optional[type] 等價于 Union[type, None],表示某個值可以是 type 或 None。
4.Union
表示一個變量可以是多個類型之一。Union[type1, type2, ...] 表示變量可以是 type1、type2 等中的任意一種。
5.Any
表示可以是任意類型。Any 用于聲明一個變量可以是任意類型,不做類型檢查。
6.Callable
表示可調(diào)用的對象,如函數(shù)。Callable[[arg_type1, arg_type2], return_type] 用于表示一個函數(shù),參數(shù)類型為 arg_type1、arg_type2,返回值類型為 return_type。
7.TypeVar
用于定義泛型。TypeVar 用于創(chuàng)建通用函數(shù)或類。
8.Literal
限制變量值為某些特定的值。
9.Set
表示一個包含特定類型元素的集合。比如 Set[str] 表示一個字符串集合。
10.FrozenSet
表示一個不可變的集合。比如 FrozenSet[int] 表示一個不可變的整數(shù)集合。
11.Generic
用于創(chuàng)建泛型類和泛型接口。比如 class MyList(Generic[T]) 表示一個泛型列表類,可以存儲類型 T 的元素。
12.Type
表示一個類型對象。比如 Type[str] 表示 str 類型。
二.常見用法
1.List|Dict|Tuple示例
from typing import List, Dict, Tuple
# 一個返回包含字符串的列表的函數(shù)
def get_names() -> List[str]:
return ["Alice", "Bob", "Charlie"]
# 一個帶有字典類型提示的函數(shù)
def get_person_data() -> Dict[str, int]:
return {"Alice": 30, "Bob": 25}
# 一個帶有元組類型提示的函數(shù)
def get_coordinates() -> Tuple[int, int]:
return (10, 20)get_names():返回一個List[str],即一個字符串列表。get_person_data():返回一個Dict[str, int],表示字典的鍵是字符串,值是整數(shù)。get_coordinates():返回一個Tuple[int, int],即一個包含兩個整數(shù)的元組。
2.Optional 示例
from typing import Optional
def find_user(user_id: int) -> Optional[str]:
if user_id == 1:
return "Alice"
return Nonefind_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
# 定義一個函數(shù)接收另一個函數(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) # 返回 7execute_task():接收一個可調(diào)用對象(函數(shù)),該對象接收兩個整數(shù)并返回一個整數(shù)。
5.TypeVar 泛型示例
from typing import TypeVar, List
T = TypeVar('T')
def get_first_element(lst: List[T]) -> T:
return lst[0]
# 使用時可以是不同的類型
print(get_first_element([1, 2, 3])) # 返回 1
print(get_first_element(['a', 'b', 'c'])) # 返回 'a'TypeVar:允許定義一個泛型函數(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)分析工具標記為錯誤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é)議,可以檢查對象是否實現(xiàn)了特定的方法和屬性。
from typing import Protocol
class Drawable(Protocol):
def draw(self) -> None:
...4.Final 示例
表示一個變量、方法或?qū)傩圆荒鼙恢貙懟蛐薷摹?/p>
from typing import Final MAX_SIZE: Final = 100
5.ClassVar 示例
表示一個類變量,它不應(yīng)被視為實例變量的一部分。
from typing import ClassVar
class MyClass:
class_var: ClassVar[int] = 426.NoReturn
表示函數(shù)不會返回任何值(通常用于函數(shù)拋出異常的情況)。
from typing import NoReturn
def terminate() -> NoReturn:
raise SystemExit參考文獻
[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表格處理模塊xlrd在Anaconda中的安裝方法
本文介紹在Anaconda環(huán)境下,安裝Python讀取.xls格式表格文件的庫xlrd的方法,xlrd是一個用于讀取Excel文件的Python庫,本文介紹了xlrd庫的一些主要特點和功能,感興趣的朋友一起看看吧2024-04-04
Phantomjs抓取渲染JS后的網(wǎng)頁(Python代碼)
phantomjs:我的理解就是它是一個無顯示的瀏覽器,也就是說除了不能顯示頁面內(nèi)容以外,瀏覽器能干的活兒它基本上都能干。下面我們就來利用他做點有趣的事情2016-05-05
python自動化腳本安裝指定版本python環(huán)境詳解
這篇文章主要為大家詳細介紹了python自動化腳本安裝指定版本python環(huán)境的相關(guān)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-09-09
python射線法判斷檢測點是否位于區(qū)域外接矩形內(nèi)
這篇文章主要為大家詳細介紹了python射線法判斷檢測點是否位于區(qū)域外接矩形內(nèi),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06
Pandas刪除數(shù)據(jù)的幾種情況(小結(jié))
這篇文章主要介紹了Pandas刪除數(shù)據(jù)的幾種情況(小結(jié)),詳細的介紹了4種方式,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-06-06

