欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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模塊中的TypeVarGeneric進(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ù)文件功能的示例代碼

    Python實(shí)現(xiàn)清理重復(fù)文件功能的示例代碼

    在電腦上或多或少的存在一些重復(fù)文件,體積小的倒沒什么,如果體積大的就很占內(nèi)存了。本文用python制作了一個刪除重復(fù)文件的小工具,核心代碼很簡單,希望對你有所幫助
    2022-07-07
  • Django 實(shí)現(xiàn)購物車功能的示例代碼

    Django 實(shí)現(xiàn)購物車功能的示例代碼

    這篇文章主要介紹了Django 實(shí)現(xiàn)購物車功能的示例代碼,實(shí)現(xiàn)了刪除產(chǎn)品和顯示購物車的一系列購物車的實(shí)現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • Python DataFrame Rank詳解

    Python DataFrame Rank詳解

    在數(shù)據(jù)分析中,pandas庫的DataFrame對象的rank()方法可用于計算數(shù)據(jù)排名,處理重復(fù)值并支持多種參數(shù)定制排名規(guī)則,如ascending、axis、numeric_only等,是數(shù)據(jù)分析和競賽中的有力工具
    2024-09-09
  • Python單元測試框架unittest簡明使用實(shí)例

    Python單元測試框架unittest簡明使用實(shí)例

    這篇文章主要介紹了Python單元測試框架unittest簡明使用實(shí)例,本文講解了基本測試步驟、和測試實(shí)例,需要的朋友可以參考下
    2015-04-04
  • python發(fā)送郵件示例(支持中文郵件標(biāo)題)

    python發(fā)送郵件示例(支持中文郵件標(biāo)題)

    python發(fā)送中文郵件示例,支持中文郵件標(biāo)題和中文郵件內(nèi)容。支持多附件。根據(jù)用戶名推測郵件服務(wù)器提供商
    2014-02-02
  • Python操作Redis數(shù)據(jù)庫的超詳細(xì)教程

    Python操作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中的null是什么

    詳解Python中的null是什么

    這篇文章主要介紹了Python中的null是什么,Python中其實(shí)沒有null這個詞,取而代之的是None對象,即特殊類型NoneType,代表空、沒有,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Django自定義過濾器定義與用法示例

    Django自定義過濾器定義與用法示例

    這篇文章主要介紹了Django自定義過濾器定義與用法,結(jié)合實(shí)例形式分析了Django自定義過濾器的概念、功能、定義及使用方法,需要的朋友可以參考下
    2018-03-03
  • 基于Python實(shí)現(xiàn)溫度轉(zhuǎn)換程序

    基于Python實(shí)現(xiàn)溫度轉(zhuǎn)換程序

    這篇文章主要為大家詳細(xì)介紹了如何基于Python實(shí)現(xiàn)簡單的溫度轉(zhuǎn)換程序,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-10-10
  • python黑魔法之編碼轉(zhuǎn)換

    python黑魔法之編碼轉(zhuǎn)換

    這篇文章主要介紹了python黑魔法之編碼轉(zhuǎn)換,分析了python編碼轉(zhuǎn)換的方法,感興趣的小伙伴們可以參考一下
    2016-01-01

最新評論