偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

提升Python代碼質(zhì)量:類(lèi)型提示的運(yùn)用與實(shí)踐

開(kāi)發(fā) 前端
介紹Python類(lèi)型提示及其應(yīng)用。類(lèi)型提示可增強(qiáng)代碼可讀性,幫助檢測(cè)錯(cuò)誤,提供更好的IDE支持。通過(guò)使用typing模塊,可以擴(kuò)展Python的類(lèi)型提示功能,編寫(xiě)更高質(zhì)量的代碼。

介紹Python類(lèi)型提示及其應(yīng)用。類(lèi)型提示可增強(qiáng)代碼可讀性,幫助檢測(cè)錯(cuò)誤,提供更好的IDE支持。通過(guò)使用typing模塊,可以擴(kuò)展Python的類(lèi)型提示功能,編寫(xiě)更高質(zhì)量的代碼。

使用類(lèi)型提示的原因

Python 的動(dòng)態(tài)類(lèi)型特質(zhì)使其與靜態(tài)類(lèi)型語(yǔ)言(如 C/C++ 和 Java)有所不同。靜態(tài)類(lèi)型語(yǔ)言中,我們必須先使用特定類(lèi)型顯式聲明變量,然后才能為變量賦值。在C/C++/Java 程序運(yùn)行過(guò)程中,變量只能保存預(yù)定類(lèi)型的數(shù)據(jù)。

然而,Python 作為動(dòng)態(tài)類(lèi)型語(yǔ)言,始終為我們提供了無(wú)需顯式聲明變量類(lèi)型的靈活性。以下是在 Python 交互式 shell或腳本中可以使用的示例:

# 定義變量
x = 10
print(type(x))  # 輸出: <class 'int'>

# 現(xiàn)在將一個(gè)字符串分配給同一個(gè)變量
x = "Hello, World!"
print(type(x))  # 輸出: <class 'str'>

# 現(xiàn)在為同一變量指定一個(gè)浮點(diǎn)值
x = 3.14
print(type(x))  # 輸出: <class 'float'>

# 現(xiàn)在為同一變量分配一個(gè)列表
x = [1, 2, 3]
print(type(x))  # 輸出: <class 'list'>

在上述例子中,x從整數(shù)(int)開(kāi)始,然后變成字符串(str),接著是浮點(diǎn)數(shù)(float),最后是列表(list)。我們每次使用type()函數(shù)打印x的類(lèi)型。

雖然這種做法具有一定的優(yōu)點(diǎn),但是也可能會(huì)產(chǎn)生潛在的錯(cuò)誤和誤解,尤其是在處理大型代碼庫(kù)或與團(tuán)隊(duì)協(xié)作時(shí)。例如:

def add(a, b):
  return a + b


print(add(1, 2))  # 輸出: 3

print(add("Hello, ", "World!"))  # 輸出: Hello, World!

print(add(1, "2"))  # 引發(fā)類(lèi)型錯(cuò)誤

為了提高代碼的可讀性并防止某些類(lèi)型的錯(cuò)誤,Python 3.5 引入了稱(chēng)為‘類(lèi)型提示’的可選功能。

Python 類(lèi)型提示是什么?

類(lèi)型提示是Python中的一種機(jī)制,用于指出函數(shù)參數(shù)和返回值的預(yù)期類(lèi)型。它們有助于進(jìn)行靜態(tài)類(lèi)型檢查,可以使用諸如Mypy、Pyright或Pytype等工具進(jìn)行靜態(tài)類(lèi)型檢查。類(lèi)型提示不是由Python解釋器本身強(qiáng)制執(zhí)行的,這意味著它們不會(huì)影響程序的實(shí)際運(yùn)行時(shí)行為。

以下是一個(gè)帶有類(lèi)型提示的函數(shù)示例:

def greet(name: str) -> str:
  return 'Hello, ' + name

在此示例中,name:str是一個(gè)類(lèi)型提示,表明名稱(chēng)應(yīng)為字符串,而->str則是一個(gè)類(lèi)型提示,指出函數(shù)應(yīng)返回字符串。

Python 的類(lèi)型提示可以利用所有標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型,以及從模塊中導(dǎo)入定義的數(shù)據(jù)類(lèi)型,以及用戶(hù)創(chuàng)建的自定義類(lèi)型(如示例 1-5 中所示)。這些類(lèi)型提示可以在各種上下文應(yīng)用,包括全局變量、函數(shù)和方法中的參數(shù),以及這些函數(shù)和方法中的局部變量。

類(lèi)型提示的好處

增強(qiáng)了代碼的可讀性

類(lèi)型提示使代碼更明確、更易理解。它們標(biāo)明了函數(shù)參數(shù)和返回值的類(lèi)型,從而令函數(shù)的使用方式更易理解。

錯(cuò)誤檢測(cè)

您可以使用 Mypy、Pyright 或 Pytype 等工具根據(jù)類(lèi)型提示執(zhí)行靜態(tài)類(lèi)型檢查。這些工具可以在運(yùn)行代碼之前捕獲與類(lèi)型相關(guān)的潛在錯(cuò)誤。例如:

def add(a: int, b: int) -> int:
  return a + b


# 這將引發(fā)類(lèi)型檢查錯(cuò)誤,因?yàn)?2'是字符串,而不是整數(shù)。
result = add(1, '2')

更好地支持 IDE

許多 IDE 和編輯器(如 PyCharm 或 Visual Studio Code)可以利用類(lèi)型提示為您提供更好的代碼補(bǔ)全和其他類(lèi)型的智能幫助功能。

自我記錄代碼

類(lèi)型提示能作為 Python 解釋器檢查的一種文檔形式。這有助于使文檔與代碼保持同步。例如:

def connect(host: str, port: int, timeout: float = 1.0) -> Connection:
  """連接到給定的主機(jī)和端口。"""
  # 實(shí)施

在這個(gè)函數(shù)簽名中,我們可以觀察到connect函數(shù)需要一個(gè)字符串類(lèi)型的主機(jī)、一個(gè)整數(shù)類(lèi)型的端口和一個(gè)可選的浮點(diǎn)數(shù)類(lèi)型的超時(shí)(默認(rèn)為1.0),并會(huì)返回一個(gè)Connection對(duì)象。任何閱讀代碼的人,以及任何理解Python類(lèi)型提示的工具,都可以使用這些信息。

typing模塊

typing模塊是Python標(biāo)準(zhǔn)庫(kù)中相對(duì)較新添加的模塊,它通過(guò)提供一組特殊的數(shù)據(jù)類(lèi)型:列表、元組和字典,來(lái)擴(kuò)展Python的類(lèi)型提示功能。

其中的每一個(gè)都對(duì)應(yīng)于Python內(nèi)部的一種類(lèi)型:列表、元組和字典。雖然Python的內(nèi)置集合可以容納任何類(lèi)型的項(xiàng),但typing模塊允許指定集合中包含的項(xiàng)類(lèi)型,從而提供了更詳細(xì)、信息量更大的類(lèi)型提示。

例如:

>>> list_1: list = ["Tony", 2, 1.5E2, True]
>>> import typing
>>> list_2: typing.List[float] = [10, 2.50, 4.2E-3]

在以上內(nèi)容中,list_1是一個(gè)標(biāo)準(zhǔn)列表,能容納各種類(lèi)型的元素。另一方面,list_2是typing.List類(lèi)型的,應(yīng)僅包含浮點(diǎn)數(shù)類(lèi)型的元素。但是,如果無(wú)錯(cuò)誤地追加了nonfloat類(lèi)型的對(duì)象,則Python運(yùn)行時(shí)會(huì)忽略此提示:

>>> l2.append("test")
[10, 2.5, 0.0042, 'test']

typing模塊的主要功能

  • 類(lèi)型提示:為變量和函數(shù)參數(shù)指定預(yù)期類(lèi)型。
  • 泛型類(lèi)型:用參數(shù)定義類(lèi)型,如List[int]。
  • 類(lèi)型別名:為復(fù)雜類(lèi)型創(chuàng)建別名以提高可讀性。
  • 函數(shù)重載:定義函數(shù)的多種調(diào)用方式。
  • 類(lèi)型檢查:靜態(tài)類(lèi)型檢查程序可以使用提示來(lái)驗(yàn)證類(lèi)型的正確性。

最佳實(shí)踐

在Python中,有效地使用typing模塊能極大地增強(qiáng)代碼的可讀性、可維護(hù)性和健壯性。以下是利用這一強(qiáng)大功能的一些最佳實(shí)踐:

  • 從公共接口入手:首先為模塊或類(lèi)的公共接口添加類(lèi)型提示,這些接口是代碼的其他部分或外部用戶(hù)要使用的函數(shù)、方法和類(lèi)。
  • 挑選特定類(lèi)型:若可能,挑選特定類(lèi)型,而非通用類(lèi)型。例如,首選List[int],別選擇List,或者首選Dict[str,float],別選Dict。這種獨(dú)特性提供了更清晰的對(duì)函數(shù)預(yù)期和返回的指導(dǎo),因此使靜態(tài)類(lèi)型分析器能更好地進(jìn)行錯(cuò)誤檢查。

為復(fù)雜類(lèi)型創(chuàng)建類(lèi)型別名:對(duì)于復(fù)雜或頻繁使用的類(lèi)型,請(qǐng)使用TypeVar和NewType函數(shù)創(chuàng)建類(lèi)型別名。這不僅提升了可讀性,而且使得日后重構(gòu)或更改類(lèi)型更方便。

from typing import List, TypeVar

UserId = NewType('UserId', int)
Vector = TypeVar('Vector', List[float], List[int])
  • 逐步實(shí)行類(lèi)型提示:Python 的類(lèi)型系統(tǒng)設(shè)計(jì)的目標(biāo)是漸進(jìn)式的。您不用一次性注釋所有代碼??梢詮淖铌P(guān)鍵的部分開(kāi)始,逐步增加覆蓋范圍。在大型現(xiàn)有代碼庫(kù)中,這種方法更加可行,因?yàn)樵谶@些代碼庫(kù)中立即進(jìn)行全面檢修是不切實(shí)際的。
  • 對(duì)可為 null 的類(lèi)型使用 Optional:當(dāng)變量可能為 None 時(shí),顯式將其標(biāo)記為 Optional。這種做法清楚地說(shuō)明該變量可以具有 None 值,并強(qiáng)制您在代碼中處理這種情況,因此可以防止看似合理卻可能引起 NoneType錯(cuò)誤的情況出現(xiàn)。
from typing import Optional


def function(arg: Optional[int]) -> None:
  ...
  • 利用類(lèi)型檢查工具:將 mypy 或 pyright 等工具中的類(lèi)型檢查納入您的開(kāi)發(fā)工作流程。將這些檢查作為持續(xù)集成流程的一部分運(yùn)行,以便在類(lèi)型錯(cuò)誤進(jìn)入生產(chǎn)環(huán)境之前將其捕獲。

總結(jié)

本文主要介紹了Python中的類(lèi)型提示的概念、使用原因以及如何利用其優(yōu)勢(shì)。類(lèi)型提示可明確代碼意圖、增強(qiáng)代碼可讀性、以及在運(yùn)行代碼之前捕獲類(lèi)型相關(guān)錯(cuò)誤。typing模塊則進(jìn)一步擴(kuò)展了Python的類(lèi)型提示功能,可以指定集合中的項(xiàng)類(lèi)型,從而提供更詳細(xì)、更豐富的類(lèi)型提示。通過(guò)有效地使用本文所述技術(shù),可以大大提高代碼的可讀性、可維護(hù)性和健壯性。

責(zé)任編輯:華軒 來(lái)源: 哈希編程
相關(guān)推薦

2023-10-26 07:02:49

技術(shù)團(tuán)隊(duì)驅(qū)動(dòng)開(kāi)發(fā)

2017-01-20 09:45:20

JavaScript代碼質(zhì)量

2022-03-25 09:22:42

代碼開(kāi)發(fā)

2025-04-11 03:00:55

2024-08-06 12:35:42

C#代碼重構(gòu)

2013-09-22 10:38:46

代碼優(yōu)化經(jīng)驗(yàn)

2015-05-06 09:20:34

代碼質(zhì)量代碼審查實(shí)踐

2024-10-30 08:08:45

2014-02-04 19:48:07

重構(gòu)代碼質(zhì)量

2021-08-19 15:19:16

代碼開(kāi)發(fā)模型

2023-03-16 08:01:56

TypeScript開(kāi)源編程語(yǔ)言

2021-08-26 15:45:05

Python編程語(yǔ)言軟件開(kāi)發(fā)

2020-12-08 06:24:08

Java 代碼工具

2023-10-10 14:57:49

2020-08-12 07:00:00

開(kāi)發(fā)代碼技術(shù)

2021-12-02 09:54:11

Python 開(kāi)發(fā)編程語(yǔ)言

2024-06-19 16:02:46

2024-06-14 12:04:33

2025-03-03 09:20:00

VueUseVue.js前端

2022-10-09 07:07:51

Python類(lèi)型代碼
點(diǎn)贊
收藏

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