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

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

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

使用動態語言一時爽,代碼重構火葬場。相信你一定聽過這句話,和單元測試一樣,雖然寫代碼的時候花費你少量的時間,但是從長遠來看,這是非常值得的。本文分享如何更好的理解和使用 Python 的類型提示。

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

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

Python 的變量類型是動態的,可以在運行時修改,為代碼添加類型提示,僅在語法層面支持,對代碼的運行沒有任何影響,Python 解釋器在運行代碼的時候會忽略類型提示。

因此類型提示一個直觀的作用就是提升代碼的可讀性,方便調用者傳入/傳出恰當類型的參數,便于代碼重構。

Python 內置的基本類型可以直接用于類型提示:

變量的類型提示示例:

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")

函數的類型提示:

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 可以是內置的基本類型,也可以是自定義類型。

類的類型提示:

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

2、用 mypy 檢查類型提示

假如有這樣一段代碼:

x: int = 2

x = 3.5

用 Python 解釋器執行是不會有任何錯誤的:

圖片

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

圖片

更多 mypy 相關可以參考前文mypy 這個工具,讓Python的類型提示變得非常實用。

3、類型提示的好處

如果解釋器沒有強制執行類型提示,為什么還要編寫類型提示呢?確實,類型提示不會改變代碼的運行方式:Python 本質上是動態類型的,這一點不太可能會改變。但是,從開發人員經驗的角度來看,類型提示有很多好處。

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

(2)、類型提示消除了認知開銷,并使代碼更易于閱讀和調試。考慮到輸入和輸出的類型,你可以輕松推斷對象以及它們如何調用。

(3)、類型提示可改善代碼編輯體驗。IDE 可以依靠類型檢測來靜態分析你的代碼并幫助檢測潛在的錯誤(例如,傳遞錯誤類型的參數、調用錯誤的方法等)。另外,還可以根據類型提示為每個變量提供自動補全。

圖片

IDE 的類型檢查

圖片

IDE 的類型檢查

圖片

IDE 類型檢查后的自動補全

4、List 用法

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

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

標準庫 typing 考慮到了這個問題,你可以這樣:

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] 現在等價于 X | Y。

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

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

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 用法

當你需要傳入一個函數作為參數的時候,這個參數的類型提示可以為 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)

你還可以給這樣的函數參數指定參數列表,真的很強大:

語法:

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 用法

當你傳入的參數可以為任何類型的時候,就可以使用 Any

def bar(input: Any):
...

10、Optional 用法

如果你的函數使用可選參數,具有默認值,那么你可以使用類型模塊中的 Optional 類型。

from typing import Optional

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

11、Sequence 用法

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

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 需要指定每一個位置的類型:

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

如果你不關心元組中每個元素的類型,你可以繼續使用內置類型 tuple。

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

最后的話

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

責任編輯:武曉燕 來源: Python七號
相關推薦

2015-08-03 10:41:52

大數據

2021-08-26 15:45:05

Python編程語言軟件開發

2023-12-18 18:58:54

Python類型提示代碼

2023-10-10 08:00:00

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-22 15:06:05

Python解釋程序

2010-02-03 09:27:21

編寫Python程序

2010-03-15 14:47:19

Python內置對象

2010-08-10 09:12:50

DB2驅動類型

2016-12-30 14:47:21

設計RESTfulAPI

2021-03-17 08:00:59

JS語言Javascript

2010-01-15 16:25:48

學習C++

2010-01-15 19:28:59

C++

2020-09-03 08:02:36

CDN降本P2P

2023-08-17 14:22:17

深度學習機器學習

2013-08-29 13:31:07

PostgreSQL數據庫數據庫日期

2024-05-14 15:28:09

Python類型提示開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区不卡 | 精品一区二区三区在线视频 | 伊人网综合在线 | 黄视频网站在线 | 精品久久久久一区二区国产 | 日韩成人在线一区 | 亚洲 欧美 另类 综合 偷拍 | 亚洲一区二区在线视频 | 婷婷99 | 欧美日韩国产在线 | 成人欧美日韩一区二区三区 | 日韩伦理电影免费在线观看 | 在线色网站 | 青青草av在线播放 | 日日夜夜av| 久久精品视频在线免费观看 | 欧美另类视频在线 | 午夜国产羞羞视频免费网站 | 欧美性吧 | 综合精品在线 | 久久www免费视频 | 久久久精 | 国产欧美精品区一区二区三区 | 亚洲精品电影在线观看 | 一级免费毛片 | 午夜精品久久久久久久星辰影院 | caoporn视频 | 国产婷婷精品 | 福利视频网站 | 国产成人精品免高潮在线观看 | 久久久久国产精品一区 | 免费v片| 国产中文| 午夜精品一区二区三区在线观看 | 91精品国产乱码久久久久久久 | 久久精品国产一区二区电影 | 久久九九99 | 能看的av| 国产精品成人一区二区三区 | 午夜影视在线观看 | av中文字幕在线 |