最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python的type?hints(類型標注、類型注解、類型提示)示例詳解

 更新時間:2024年08月13日 09:32:40   作者:小李子-_-  
在Python編程中,類型提示(Type Hints)是一種強大的工具,它能夠幫助開發(fā)者在編寫代碼時明確表達變量、函數(shù)參數(shù)和返回值的預期類型,這篇文章主要給大家介紹了關(guān)于python的type?hints(類型標注、類型注解、類型提示)的相關(guān)資料,需要的朋友可以參考下

1. 前言

type hints(類型標注、類型注解、類型提示)是指在代碼中涉及到數(shù)據(jù)交互的地方,提供數(shù)據(jù)類型的注解(顯式的說明)。類型注解可以幫助第三方IDE工具(PyCharm)對代碼進行類型推斷,協(xié)助做代碼提示;能幫助開發(fā)者自身對變量進行類型標注。類型注解可分為:變量的類型注解、函數(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()

除了使用變量: 類型這種格式外,還可以在注釋中進行類型注解,語法:# 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ù)(方法)形參類型和返回值類型進行標注,定義語法如下:

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庫來檢驗最終代碼是否符合設(shè)定的類型注解。mypy是python中有關(guān)類型的靜態(tài)分析工具。

#安裝 mypy
pip install mypy

# 執(zhí)行下面代碼來查看是否符合設(shè)定的類型注解
mypy test.py

3. 標準庫typing模塊

上面只是簡單的類型注解,傳入的類型表述能力有限,不能說明復雜的類型組成情況,因此可以引入typing模塊來實現(xiàn)復雜的類型表達,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

對于更為復雜的類型注解,我們可以使用聯(lián)合類型注解Union。typing模塊中的Union可以給一個變量或函數(shù)返回值標注多種類型,它表示的意思。例如:data: Union[str, bytes],變量data可以是str類型或bytes類型。在Python 3.10版本及以后,推薦使用|運算符代替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)

因為在python中一切皆為對象,所以可將復雜一點的類型賦給某個變量,也就是起個別名,這樣使用起來較為方便。

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)來判斷當前對象是否為可調(diào)用對象
# print(isinstance(print_name, Callable))  # 輸出 True

fun = get_name(print_name)
fun("zhangsan")

3.5 TypeVar和Generic

泛型是一種可以在不指定具體類型的情況下編寫可復用代碼的技術(shù)。Python中的泛型是使用typing模塊中的TypeVarGeneric進行實現(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])  # 可以打印浮點數(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在默認情況下為Any類型

def print_info(var: Any) -> None:
    print(var)

print_info(11)
print([1,2,3,4])
print("string")

最后再說一句:如果你按照規(guī)范的格式進行類型注解,卻發(fā)現(xiàn)報錯誤,那很大可能是python版本太低。比如下面代碼中的類型注解就是在python 3.10開始支持的,3.10版本以下的不支持該語法格式的類型注解。

x: int | float = 2 # 表示 or Python 3.10 開始支持

參考文章:

總結(jié) 

到此這篇關(guān)于python的type hints(類型標注、類型注解、類型提示)的文章就介紹到這了,更多相關(guān)Python類型提示Type Hints內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • window11系統(tǒng)下Python3.11安裝numpy庫超詳細教程

    window11系統(tǒng)下Python3.11安裝numpy庫超詳細教程

    這篇文章主要給大家介紹了關(guān)于window11系統(tǒng)下Python3.11安裝numpy庫的相關(guān)資料,NumPy是Python的第三方擴展包,但它并沒有包含在Python標準庫中,因此您需要單獨安裝它,需要的朋友可以參考下
    2023-12-12
  • 解決usageerror: line magic function "%%time" not found問題

    解決usageerror: line magic function "

    這篇文章主要介紹了解決usageerror: line magic function "%%time" not found問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • ipython和python區(qū)別詳解

    ipython和python區(qū)別詳解

    在本篇文章里小編給大家分享了關(guān)于ipython和python區(qū)別的相關(guān)知識點,有興趣的朋友們跟著學習下。
    2019-06-06
  • 對Python中class和instance以及self的用法詳解

    對Python中class和instance以及self的用法詳解

    今天小編就為大家分享一篇對Python中class和instance以及self的用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • 簡單介紹Ruby中的CGI編程

    簡單介紹Ruby中的CGI編程

    這篇文章主要介紹了簡單介紹Ruby中的CGI編程,包括創(chuàng)建Form表單等基本內(nèi)容,需要的朋友可以參考下
    2015-04-04
  • Python實現(xiàn)一行代碼自動繪制藝術(shù)畫

    Python實現(xiàn)一行代碼自動繪制藝術(shù)畫

    DiscoArt?是一個很牛的開源模塊,它能根據(jù)你給定的關(guān)鍵詞自動繪畫。本文就將利用這一模塊實現(xiàn)一行代碼自動繪制藝術(shù)畫,需要的可以參考一下
    2022-12-12
  • python實現(xiàn)詩歌游戲(類繼承)

    python實現(xiàn)詩歌游戲(類繼承)

    這篇文章主要為大家詳細介紹了python實現(xiàn)詩歌游戲,根據(jù)上句猜下句、猜作者、猜朝代、猜詩名,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • 使用Python時要注意的十大陷阱匯總

    使用Python時要注意的十大陷阱匯總

    Python雖然沒有C/C++的指針和各種數(shù)據(jù)類型轉(zhuǎn)換,但不代表它沒有一片坦途,對于初學者,再感嘆Python的簡單和強大之時,可能一不小心就掉到陷阱中去了,所以本文給大家盤點了使用Python時要注意的十大陷阱,需要的朋友可以參考下
    2025-06-06
  • python中的單下劃線與雙下劃線以及絕對導入與相對導入

    python中的單下劃線與雙下劃線以及絕對導入與相對導入

    這篇文章主要介紹了python中的單下劃線與雙下劃線以及絕對導入與相對導入說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • python?包(模塊?函數(shù)?類?定義?導入)使用詳解

    python?包(模塊?函數(shù)?類?定義?導入)使用詳解

    這篇文章主要為大家介紹了python?包(模塊?函數(shù)?類?定義?導入)的使用詳細講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03

最新評論

和龙市| 伊金霍洛旗| 博爱县| 六盘水市| 鄂托克旗| 黄山市| 外汇| 黑山县| 临颍县| 开平市| 磴口县| 朝阳市| 吴川市| 辽宁省| 东乌珠穆沁旗| 镇平县| 浦县| 九龙县| 靖州| 碌曲县| 砚山县| 南江县| 古蔺县| 宜宾县| 突泉县| 通山县| 青冈县| 岳普湖县| 习水县| 宜城市| 汕头市| 黄浦区| 徐闻县| 英吉沙县| 洪泽县| 米脂县| 揭东县| 宜兴市| 阿勒泰市| 哈密市| 来凤县|