Python中型別提示的最佳實踐
使用動態語言一時爽,程式碼重構火葬場。相信你一定聽過這句話,和單元測試一樣,雖然寫程式碼的時候花費你少量的時間,但是從長遠來看,這是非常值得的。本文分享如何更好的理解和使用 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
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中型別提示的最佳實踐的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

HadiDB:輕量級、高水平可擴展的Python數據庫HadiDB(hadidb)是一個用Python編寫的輕量級數據庫,具備高度水平的可擴展性。安裝HadiDB使用pip安裝:pipinstallhadidb用戶管理創建用戶:createuser()方法創建一個新用戶。 authentication()方法驗證用戶身份。 fromhadidb.operationimportuseruser_obj=user("admin","admin")user_obj.

2小時內可以學會Python的基本編程概念和技能。 1.學習變量和數據類型,2.掌握控制流(條件語句和循環),3.理解函數的定義和使用,4.通過簡單示例和代碼片段快速上手Python編程。

直接通過 Navicat 查看 MongoDB 密碼是不可能的,因為它以哈希值形式存儲。取回丟失密碼的方法:1. 重置密碼;2. 檢查配置文件(可能包含哈希值);3. 檢查代碼(可能硬編碼密碼)。

Python在web開發、數據科學、機器學習、自動化和腳本編寫等領域有廣泛應用。 1)在web開發中,Django和Flask框架簡化了開發過程。 2)數據科學和機器學習領域,NumPy、Pandas、Scikit-learn和TensorFlow庫提供了強大支持。 3)自動化和腳本編寫方面,Python適用於自動化測試和系統管理等任務。

MySQL數據庫性能優化指南在資源密集型應用中,MySQL數據庫扮演著至關重要的角色,負責管理海量事務。然而,隨著應用規模的擴大,數據庫性能瓶頸往往成為製約因素。本文將探討一系列行之有效的MySQL性能優化策略,確保您的應用在高負載下依然保持高效響應。我們將結合實際案例,深入講解索引、查詢優化、數據庫設計以及緩存等關鍵技術。 1.數據庫架構設計優化合理的數據庫架構是MySQL性能優化的基石。以下是一些核心原則:選擇合適的數據類型選擇最小的、符合需求的數據類型,既能節省存儲空間,又能提升數據處理速度

作為數據專業人員,您需要處理來自各種來源的大量數據。這可能會給數據管理和分析帶來挑戰。幸運的是,兩項 AWS 服務可以提供幫助:AWS Glue 和 Amazon Athena。

啟動 Redis 服務器的步驟包括:根據操作系統安裝 Redis。通過 redis-server(Linux/macOS)或 redis-server.exe(Windows)啟動 Redis 服務。使用 redis-cli ping(Linux/macOS)或 redis-cli.exe ping(Windows)命令檢查服務狀態。使用 Redis 客戶端,如 redis-cli、Python 或 Node.js,訪問服務器。

要從 Redis 讀取隊列,需要獲取隊列名稱、使用 LPOP 命令讀取元素,並處理空隊列。具體步驟如下:獲取隊列名稱:以 "queue:" 前綴命名,如 "queue:my-queue"。使用 LPOP 命令:從隊列頭部彈出元素並返回其值,如 LPOP queue:my-queue。處理空隊列:如果隊列為空,LPOP 返回 nil,可先檢查隊列是否存在再讀取元素。
