python的type?hints(類型標(biāo)注、類型注解、類型提示)示例詳解
1. 前言
type hints(類型標(biāo)注、類型注解、類型提示)是指在代碼中涉及到數(shù)據(jù)交互的地方,提供數(shù)據(jù)類型的注解(顯式的說明)。類型注解可以幫助第三方IDE工具(PyCharm)對代碼進(jìn)行類型推斷,協(xié)助做代碼提示;能幫助開發(fā)者自身對變量進(jìn)行類型標(biāo)注。類型注解可分為:變量的類型注解、函數(shù)(方法)形參列表和返回值的類型注解??偠灾?,加上注解之后,我們可以直觀的看出變量、函數(shù)(方法)參數(shù)列表和返回值到底是個什么東西(什么類型)。
2. 簡單的類型注解
簡單的類型注解(基本類型注解):可以使用int、str和list等基本類型來注解變量、函數(shù)參數(shù)和返回值的類型。
2.1 變量的類型注解
為變量設(shè)置類型注解,語法格式為:變量: 類型,代碼示例如下。
num: int = 10 s: str = "hello" my_list: list = [1,2,3,4] my_tuple: tuple = (1,2,3) class Student: pass stu: Student = Student()
除了使用變量: 類型這種格式外,還可以在注釋中進(jìn)行類型注解,語法:# type: 類型,示例代碼如下。
num = 10 # type: int s = "hello" # type: str my_list = [1,2,3,4] # type: list my_tuple = (1,2,3) # type: tuple
2.2 函數(shù)(方法)的類型注解
給函數(shù)(方法)形參類型和返回值類型進(jìn)行標(biāo)注,定義語法如下:
def 函數(shù)(或方法)名(形參1: 類型, 形參2: 類型, ...) -> 返回值類型: pass
示例代碼如下。函數(shù)注解的信息,保存在__annotations__
屬性中可以來調(diào)用。
def sum(x: int, y: int) -> int: return x+y sum(1,2) print(sum.__annotations__) # 輸出:{'x': <class 'int'>, 'y': <class 'int'>, 'return': <class 'int'>}
2.3 安裝mypy
注意:類型注解僅僅是提示性的,不是決定性的,就算你類型注解錯誤也不會報錯。像下面的代碼就不會報錯:變量num的類型注解為int,卻把字符串"hello"賦給它了;變量s的類型注解為str,卻把整數(shù)10賦給它了;函數(shù)sum的形參x,y和返回值都是int類型,卻把字符串"hello"和"world"分別賦給參數(shù)x,y。
num: int = "hello" s: str = 10 def sum(x: int, y: int) -> int: return x+y print(sum(1,2)) print(sum("hello ","world"))
我們可以通過mypy
庫來檢驗(yàn)最終代碼是否符合設(shè)定的類型注解。mypy
是python中有關(guān)類型的靜態(tài)分析工具。
#安裝 mypy pip install mypy # 執(zhí)行下面代碼來查看是否符合設(shè)定的類型注解 mypy test.py
3. 標(biāo)準(zhǔn)庫typing模塊
上面只是簡單的類型注解,傳入的類型表述能力有限,不能說明復(fù)雜的類型組成情況,因此可以引入typing
模塊來實(shí)現(xiàn)復(fù)雜的類型表達(dá),typing
是在python 3.5 才開始有的模塊。
3.1 List, Tuple, Set, Dict基礎(chǔ)用法
(1)List[int]
表示由整數(shù)(int)組成的列表;
(2)Tuple[int, str, bool]
表示由三個對象組成的元組,其中這三個對象的類型分別為int, str, bool;
(3)Set[int]
表示由整數(shù)(int)組成的集合;
(4)Dict[int, str]
表示鍵是int,值是str的字典。
代碼示例如下
from typing import List, Tuple, Set, Dict my_list: List[int] = [1, 2, 3, 4, 5, 6] my_tuple: Tuple[int, str, bool] = (1, "hi", True) my_set: Set[int] = {1, 2, 3} my_dict: Dict[int, str] = {1: "a", 2: "b", 3: "c"}
3.2 Union和Optional
對于更為復(fù)雜的類型注解,我們可以使用聯(lián)合類型注解Union
。typing
模塊中的Union
可以給一個變量或函數(shù)返回值標(biāo)注多種類型,它表示或的意思。例如:data: Union[str, bytes]
,變量data可以是str
類型或bytes
類型。在Python 3.10版本及以后,推薦使用|
運(yùn)算符代替Union
。示例代碼如下:
from typing import Union my_list: List[Union[int,str]] = [1,3,5,"hello,"world"] my_dict: Dict[str, Union[str, int]]= {"name": "Jack", "age": 16}
(1)List[Union[str,int]]
:該列表中的元素可以是int類型的對象,也可以是str類型的對象;
(2)Dict[str, Union[str, int]]
:該字典中的鍵為str,值是str和int都可以。
typing
模塊中的Optional
類型,它是Union
的一個特殊情況。如果一個變量可以是None
或其他類型,推薦使用Optional
類型,其中Optional[int]
等價于Union[int, None]
;Optional[Union[str, int, float]]
等價于Union[str, int, float, None]
。對了,Optional[]
里面只能寫一個數(shù)據(jù)類型,代碼示例如下
num1: Optional[Union[int, str, float]] = None num2: Union[int, str, float,None] = None
3.3 類型別名(type alias)
因?yàn)樵趐ython中一切皆為對象,所以可將復(fù)雜一點(diǎn)的類型賦給某個變量,也就是起個別名,這樣使用起來較為方便。
var_int = int num1: int = 10 num2: var_int # 以上兩種類型注解的方式等價 from typing import List, Dict list_alias = List[int] dict_alias = Dict[str, list_alias] my_dict: dict_alias = {"a": [1,2,3], "b": [4,5,6]} # 以上兩種類型注解的方式等價
3.4 Callable
Callable是一個可調(diào)用對象類型,語法格式為:Callable[[參數(shù)類型], 返回類型]
,包括可調(diào)用對象的參數(shù)類型和返回值類型。例如:Callable[[int], str]
,這里的int
表示可調(diào)用對象的參數(shù)類型,str
代表可調(diào)用對象的返回值類型。
from typing import Callable def print_name(name: str) -> None: print(f"name:{name}") def get_name(func: Callable[[str], None]): return func # 利用isinstance(對象, Callable)來判斷當(dāng)前對象是否為可調(diào)用對象 # print(isinstance(print_name, Callable)) # 輸出 True fun = get_name(print_name) fun("zhangsan")
3.5 TypeVar和Generic
泛型是一種可以在不指定具體類型的情況下編寫可復(fù)用代碼的技術(shù)。Python中的泛型是使用typing
模塊中的TypeVar
和Generic
進(jìn)行實(shí)現(xiàn)的。TypeVar
用于定義泛型類型變量,而Generic
用于定義泛型類。
(1)泛型類型變量:用于表示不確定的類型。泛型類型變量通常使用大寫字母命名,比如 T、U、V。
T = TypeVar('T') # 創(chuàng)建一個泛型類型變量T,T可以是任意類型
(2)泛型函數(shù):是可以接受一個或多個泛型類型參數(shù)的函數(shù),這些參數(shù)可以用來指定函數(shù)參數(shù)的類型、返回值的類型或函數(shù)內(nèi)部使用的其他類型。
from typing import TypeVar,List T = TypeVar('T') def print_list(my_list: List[T]) -> None: print(my_list) print_list([2,4,6,8]) # 可以打印整數(shù)列表 print_list(["hh","aa","www"]) # 可以打印字符串列表
(3)約束泛型:有時候我們希望泛型類型只能是特定的類型,在這種情況下,我們可以使用泛型約束來限制泛型類型的范圍。
from typing import TypeVar,List T = TypeVar('T',int,float) # 泛型類型變量T可以是int,也可以是float類型 def print_list(my_list: List[T]) -> None: print(my_list) print_list([2,4,6,8]) # 可以打印整數(shù)列表 print_list([1.2, 2.3, 3.4]) # 可以打印浮點(diǎn)數(shù)列表
(4)泛型類:是可以接受一個或多個泛型類型參數(shù)的類。這些參數(shù)可以用來指定類的屬性類型、方法參數(shù)類型、方法返回值類型或類內(nèi)部使用的其他類型。
from typing import TypeVar, Generic T = TypeVar('T') class Student(Generic[T]): # 繼承Generic[T], def __init__(self, name: T) -> None: self.name = name def get_name(self) -> T: return self.name stu = Student[str]("zhangsan") # 或者stu = Student("zhangsan") print(stu.get_name()) # 輸出:zhangsan
3.6 Any 類型
靜態(tài)類型檢查器將所有類型視為與Any
兼容,這意味著可對類型為Any
的值執(zhí)行任何操作或方法調(diào)用,并將其賦值給任何變量。
from typing import Any a = 10 # 變量a在默認(rèn)情況下為Any類型 def print_info(var: Any) -> None: print(var) print_info(11) print([1,2,3,4]) print("string")
最后再說一句:如果你按照規(guī)范的格式進(jìn)行類型注解,卻發(fā)現(xiàn)報錯誤,那很大可能是python版本太低。比如下面代碼中的類型注解就是在python 3.10開始支持的,3.10版本以下的不支持該語法格式的類型注解。
x: int | float = 2 # 表示 or Python 3.10 開始支持
參考文章:
總結(jié)
到此這篇關(guān)于python的type hints(類型標(biāo)注、類型注解、類型提示)的文章就介紹到這了,更多相關(guān)Python類型提示Type Hints內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實(shí)現(xiàn)清理重復(fù)文件功能的示例代碼
在電腦上或多或少的存在一些重復(fù)文件,體積小的倒沒什么,如果體積大的就很占內(nèi)存了。本文用python制作了一個刪除重復(fù)文件的小工具,核心代碼很簡單,希望對你有所幫助2022-07-07Django 實(shí)現(xiàn)購物車功能的示例代碼
這篇文章主要介紹了Django 實(shí)現(xiàn)購物車功能的示例代碼,實(shí)現(xiàn)了刪除產(chǎn)品和顯示購物車的一系列購物車的實(shí)現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-10-10Python單元測試框架unittest簡明使用實(shí)例
這篇文章主要介紹了Python單元測試框架unittest簡明使用實(shí)例,本文講解了基本測試步驟、和測試實(shí)例,需要的朋友可以參考下2015-04-04python發(fā)送郵件示例(支持中文郵件標(biāo)題)
python發(fā)送中文郵件示例,支持中文郵件標(biāo)題和中文郵件內(nèi)容。支持多附件。根據(jù)用戶名推測郵件服務(wù)器提供商2014-02-02Python操作Redis數(shù)據(jù)庫的超詳細(xì)教程
大家應(yīng)該都知道redis是一個基于內(nèi)存的高效的鍵值型非關(guān)系數(shù)據(jù)庫,下面這篇文章主要給大家介紹了關(guān)于Python操作Redis的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06基于Python實(shí)現(xiàn)溫度轉(zhuǎn)換程序
這篇文章主要為大家詳細(xì)介紹了如何基于Python實(shí)現(xiàn)簡單的溫度轉(zhuǎn)換程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10