成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何更好的使用 Python 的類型提示?

開發(fā) 前端
類型提示在代碼之上帶來了額外的抽象層:它們有助于記錄代碼,澄清關(guān)于輸入/輸出的假設(shè),并防止在頂部執(zhí)行靜態(tài)代碼分析 (mypy) 時(shí)出現(xiàn)的隱蔽和錯(cuò)誤。

使用動(dòng)態(tài)語言一時(shí)爽,代碼重構(gòu)火葬場(chǎng)。相信你一定聽過這句話,和單元測(cè)試一樣,雖然寫代碼的時(shí)候花費(fèi)你少量的時(shí)間,但是從長(zhǎng)遠(yuǎn)來看,這是非常值得的。本文分享如何更好的理解和使用 Python 的類型提示。

1、類型提示僅在語法層面有效

類型提示(自 PEP 3107 開始引入)用于向變量、參數(shù)、函數(shù)參數(shù)以及它們的返回值、類屬性和方法添加類型。

Python 的變量類型是動(dòng)態(tài)的,可以在運(yùn)行時(shí)修改,為代碼添加類型提示,僅在語法層面支持,對(duì)代碼的運(yùn)行沒有任何影響,Python 解釋器在運(yùn)行代碼的時(shí)候會(huì)忽略類型提示。

因此類型提示一個(gè)直觀的作用就是提升代碼的可讀性,方便調(diào)用者傳入/傳出恰當(dāng)類型的參數(shù),便于代碼重構(gòu)。

Python 內(nèi)置的基本類型可以直接用于類型提示:

變量的類型提示示例:

a: int = 3
b: float = 2.4
c: bool = True
d: list = ["A", "B", "C"]
e: dict = {"x": "y"}
f: set = {"a", "b", "c"}
g: tuple = ("name", "age", "job")

函數(shù)的類型提示:

def add_numbers(x: type_x, y: type_y, z: type_z= 100) -> type_return:
return x + y + z

這里的 type_x , type_y , type_z , type_return 可以是內(nèi)置的基本類型,也可以是自定義類型。

類的類型提示:

class Person:
first_name: str = "John"
last_name: str = "Does"
age: int = 31

2、用 mypy 檢查類型提示

假如有這樣一段代碼:

x: int = 2

x = 3.5

用 Python 解釋器執(zhí)行是不會(huì)有任何錯(cuò)誤的:

圖片

借助于 mypy 就可以,先 pip install mypy 安裝一下,然后 mypy script.py 即可:

圖片

更多 mypy 相關(guān)可以參考前文mypy 這個(gè)工具,讓Python的類型提示變得非常實(shí)用。

3、類型提示的好處

如果解釋器沒有強(qiáng)制執(zhí)行類型提示,為什么還要編寫類型提示呢?確實(shí),類型提示不會(huì)改變代碼的運(yùn)行方式:Python 本質(zhì)上是動(dòng)態(tài)類型的,這一點(diǎn)不太可能會(huì)改變。但是,從開發(fā)人員經(jīng)驗(yàn)的角度來看,類型提示有很多好處。

(1)、使用類型提示,尤其是在函數(shù)中,通過類型提示來明確參數(shù)類型和所產(chǎn)生結(jié)果的類型,非常便于閱讀和理解。

(2)、類型提示消除了認(rèn)知開銷,并使代碼更易于閱讀和調(diào)試??紤]到輸入和輸出的類型,你可以輕松推斷對(duì)象以及它們?nèi)绾握{(diào)用。

(3)、類型提示可改善代碼編輯體驗(yàn)。IDE 可以依靠類型檢測(cè)來靜態(tài)分析你的代碼并幫助檢測(cè)潛在的錯(cuò)誤(例如,傳遞錯(cuò)誤類型的參數(shù)、調(diào)用錯(cuò)誤的方法等)。另外,還可以根據(jù)類型提示為每個(gè)變量提供自動(dòng)補(bǔ)全。

圖片

IDE 的類型檢查

圖片

IDE 的類型檢查

圖片

IDE 類型檢查后的自動(dòng)補(bǔ)全

4、List 用法

假如你需要列表 list 內(nèi)部是 float 的類型提示,這樣做是不行的:

def my_dummy_function(l: list[float]):
return sum(l)

標(biāo)準(zhǔn)庫 typing 考慮到了這個(gè)問題,你可以這樣:

from typing import List

def my_dummy_function(vector: List[float]):
return sum(vector)

5、Dict 用法

假如要提示這樣的類型:

my_dict = {"name": "Somenzz", "job": "engineer"}

借助于 Dict,你可以這樣定義類型:

from typing import Dict
my_dict_type = Dict[str, str]
my_dict: my_dict_type = {"name": "Somenzz", "job": "engineer"}

6、TypedDict 用法

假如你需要提示這樣的類型,那該怎么辦?

d = {"name": "Somenzz", "interests": ["chess", "tennis"]}

借助于 TypedDict ,你可以這樣:

圖片

TypedDict

7、Union 用法

從 Python 3.10 開始,Union 被替換為 | 這意味著 Union[X, Y] 現(xiàn)在等價(jià)于 X | Y。

Union[X, Y](或 X | Y)表示 X 或 Y。

假設(shè)你的函數(shù)需要從緩存目錄中讀取文件并加載 Torch 模型。此緩存目錄位置可以是字符串值(例如 /home/cache ),也可以是 Pathlib 庫的 Path 對(duì)象,在這種情況下,代碼如下:

def load_model(filename: str, cache_folder: Union[str, Path]):
if isinstance(cache_folder, Path):
cache_folder = str(cache_folder)

model_path = os.join(filename, cache_folder)
model = torch.load(model_path)
return model

8、Callable 用法

當(dāng)你需要傳入一個(gè)函數(shù)作為參數(shù)的時(shí)候,這個(gè)參數(shù)的類型提示可以為 Callable。

from typing import Callable

def sum_numbers(x: int, y: int) -> int:
return x + y

def foo(x: int, y: int, func: Callable) -> int:
output = func(x, y)
return output

foo(1, 2, sum_numbers)

你還可以給這樣的函數(shù)參數(shù)指定參數(shù)列表,真的很強(qiáng)大:

語法:

Callable[[input_type_1, ...], return_type]

示例:

def foo(x: int, y: int, func: Callable[[int, int], int]) -> int:
output = func(x, y)
return output

9、Any 用法

當(dāng)你傳入的參數(shù)可以為任何類型的時(shí)候,就可以使用 Any

def bar(input: Any):
...

10、Optional 用法

如果你的函數(shù)使用可選參數(shù),具有默認(rèn)值,那么你可以使用類型模塊中的 Optional 類型。

from typing import Optional

def foo(format_layout: Optional[bool] = True):
...

11、Sequence 用法

Sequence 類型的對(duì)象是可以被索引的任何東西:列表、元組、字符串、對(duì)象列表、元組列表的元組等。

from typing import Sequence

def print_sequence_elements(sequence: Sequence[str]):
for i, s in enumerate(s):
print(f"item {i}: {s}"

12、Tuple 用法

Tuple 類型的工作方式與 List 類型略有不同,Tuple 需要指定每一個(gè)位置的類型:

from typing import Tuple
t: Tuple[int, int, int] = (1, 2, 3)

如果你不關(guān)心元組中每個(gè)元素的類型,你可以繼續(xù)使用內(nèi)置類型 tuple。

t: tuple = (1, 2, 3, ["cat", "dog"], {"name": "John"})

最后的話

類型提示在代碼之上帶來了額外的抽象層:它們有助于記錄代碼,澄清關(guān)于輸入/輸出的假設(shè),并防止在頂部執(zhí)行靜態(tài)代碼分析 (mypy) 時(shí)出現(xiàn)的隱蔽和錯(cuò)誤。

責(zé)任編輯:武曉燕 來源: Python七號(hào)
相關(guān)推薦

2015-08-03 10:41:52

大數(shù)據(jù)

2021-08-26 15:45:05

Python編程語言軟件開發(fā)

2023-10-10 08:00:00

2023-12-18 18:58:54

Python類型提示代碼

2010-06-23 17:42:28

Linux Bison

2010-02-02 13:59:11

Python編寫

2024-11-27 10:23:31

2024-05-15 08:20:08

GradleMaven工具

2010-02-03 09:27:21

編寫Python程序

2010-03-15 14:47:19

Python內(nèi)置對(duì)象

2010-02-22 15:06:05

Python解釋程序

2010-08-10 09:12:50

DB2驅(qū)動(dòng)類型

2023-08-17 14:22:17

深度學(xué)習(xí)機(jī)器學(xué)習(xí)

2016-12-30 14:47:21

設(shè)計(jì)RESTfulAPI

2021-03-17 08:00:59

JS語言Javascript

2010-01-15 16:25:48

學(xué)習(xí)C++

2010-01-15 19:28:59

C++

2020-09-03 08:02:36

CDN降本P2P

2013-08-29 13:31:07

PostgreSQL數(shù)據(jù)庫數(shù)據(jù)庫日期

2024-05-14 15:28:09

Python類型提示開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 视频一区二区在线观看 | 国产一区二区毛片 | www.精品国产 | 在线观看视频一区二区三区 | 日韩免费电影 | 欧美精品一区二区三区四区 在线 | 国产99久久 | 一区二区高清不卡 | 91免费小视频 | 国产精品无码专区在线观看 | 亚洲成人免费视频 | 亚洲欧美一区二区在线观看 | 99精品国产一区二区青青牛奶 | 欧美一区二区三区一在线观看 | 国产一区二区三区高清 | 亚洲欧美日韩电影 | 亚洲视频一区二区三区 | 欧美精品网站 | 日本不卡一区 | 亚洲欧美在线视频 | 国产精品7777777 | 免费视频二区 | 午夜成人免费视频 | 亚洲精品毛片av | 高清国产一区二区 | 亚洲精品久久久久久久久久久 | 91精品国产日韩91久久久久久 | 欧美在线视频网 | 在线视频99 | 日韩成人免费视频 | 亚洲精品福利视频 | 亚洲欧美日韩精品久久亚洲区 | 一区二区三区四区毛片 | 成人小视频在线观看 | 欧美激情国产日韩精品一区18 | 精品videossex高潮汇编 | 国产一区二区 | 天堂久 | 午夜一区二区三区在线观看 | 中文字幕免费视频 | 国产成人一区二区 |