当前位置:首页 > 科技  > 软件

提升Python代码质量:类型提示的运用与实践

来源: 责编: 时间:2024-05-16 09:07:05 83观看
导读介绍Python类型提示及其应用。类型提示可增强代码可读性,帮助检测错误,提供更好的IDE支持。通过使用typing模块,可以扩展Python的类型提示功能,编写更高质量的代码。使用类型提示的原因Python 的动态类型特质使其与静态类

介绍Python类型提示及其应用。类型提示可增强代码可读性,帮助检测错误,提供更好的IDE支持。通过使用typing模块,可以扩展Python的类型提示功能,编写更高质量的代码。b0428资讯网——每日最新资讯28at.com

b0428资讯网——每日最新资讯28at.com

使用类型提示的原因

Python 的动态类型特质使其与静态类型语言(如 C/C++ 和 Java)有所不同。静态类型语言中,我们必须先使用特定类型显式声明变量,然后才能为变量赋值。在C/C++/Java 程序运行过程中,变量只能保存预定类型的数据。b0428资讯网——每日最新资讯28at.com

然而,Python 作为动态类型语言,始终为我们提供了无需显式声明变量类型的灵活性。以下是在 Python 交互式 shell或脚本中可以使用的示例:b0428资讯网——每日最新资讯28at.com

# 定义变量x = 10print(type(x))  # 输出: <class 'int'># 现在将一个字符串分配给同一个变量x = "Hello, World!"print(type(x))  # 输出: <class 'str'># 现在为同一变量指定一个浮点值x = 3.14print(type(x))  # 输出: <class 'float'># 现在为同一变量分配一个列表x = [1, 2, 3]print(type(x))  # 输出: <class 'list'>

在上述例子中,x从整数(int)开始,然后变成字符串(str),接着是浮点数(float),最后是列表(list)。我们每次使用type()函数打印x的类型。b0428资讯网——每日最新资讯28at.com

虽然这种做法具有一定的优点,但是也可能会产生潜在的错误和误解,尤其是在处理大型代码库或与团队协作时。例如:b0428资讯网——每日最新资讯28at.com

def add(a, b):  return a + bprint(add(1, 2))  # 输出: 3print(add("Hello, ", "World!"))  # 输出: Hello, World!print(add(1, "2"))  # 引发类型错误

为了提高代码的可读性并防止某些类型的错误,Python 3.5 引入了称为‘类型提示’的可选功能。b0428资讯网——每日最新资讯28at.com

Python 类型提示是什么?

类型提示是Python中的一种机制,用于指出函数参数和返回值的预期类型。它们有助于进行静态类型检查,可以使用诸如Mypy、Pyright或Pytype等工具进行静态类型检查。类型提示不是由Python解释器本身强制执行的,这意味着它们不会影响程序的实际运行时行为。b0428资讯网——每日最新资讯28at.com

以下是一个带有类型提示的函数示例:b0428资讯网——每日最新资讯28at.com

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

在此示例中,name:str是一个类型提示,表明名称应为字符串,而->str则是一个类型提示,指出函数应返回字符串。b0428资讯网——每日最新资讯28at.com

Python 的类型提示可以利用所有标准数据类型,以及从模块中导入定义的数据类型,以及用户创建的自定义类型(如示例 1-5 中所示)。这些类型提示可以在各种上下文应用,包括全局变量、函数和方法中的参数,以及这些函数和方法中的局部变量。b0428资讯网——每日最新资讯28at.com

类型提示的好处

增强了代码的可读性

类型提示使代码更明确、更易理解。它们标明了函数参数和返回值的类型,从而令函数的使用方式更易理解。b0428资讯网——每日最新资讯28at.com

错误检测

您可以使用 Mypy、Pyright 或 Pytype 等工具根据类型提示执行静态类型检查。这些工具可以在运行代码之前捕获与类型相关的潜在错误。例如:b0428资讯网——每日最新资讯28at.com

def add(a: int, b: int) -> int:  return a + b# 这将引发类型检查错误,因为'2'是字符串,而不是整数。result = add(1, '2')

更好地支持 IDE

许多 IDE 和编辑器(如 PyCharm 或 Visual Studio Code)可以利用类型提示为您提供更好的代码补全和其他类型的智能帮助功能。b0428资讯网——每日最新资讯28at.com

自我记录代码

类型提示能作为 Python 解释器检查的一种文档形式。这有助于使文档与代码保持同步。例如:b0428资讯网——每日最新资讯28at.com

def connect(host: str, port: int, timeout: float = 1.0) -> Connection:  """连接到给定的主机和端口。"""  # 实施

在这个函数签名中,我们可以观察到connect函数需要一个字符串类型的主机、一个整数类型的端口和一个可选的浮点数类型的超时(默认为1.0),并会返回一个Connection对象。任何阅读代码的人,以及任何理解Python类型提示的工具,都可以使用这些信息。b0428资讯网——每日最新资讯28at.com

typing模块

typing模块是Python标准库中相对较新添加的模块,它通过提供一组特殊的数据类型:列表、元组和字典,来扩展Python的类型提示功能。b0428资讯网——每日最新资讯28at.com

其中的每一个都对应于Python内部的一种类型:列表、元组和字典。虽然Python的内置集合可以容纳任何类型的项,但typing模块允许指定集合中包含的项类型,从而提供了更详细、信息量更大的类型提示。b0428资讯网——每日最新资讯28at.com

例如:b0428资讯网——每日最新资讯28at.com

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

在以上内容中,list_1是一个标准列表,能容纳各种类型的元素。另一方面,list_2是typing.List类型的,应仅包含浮点数类型的元素。但是,如果无错误地追加了nonfloat类型的对象,则Python运行时会忽略此提示:b0428资讯网——每日最新资讯28at.com

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

typing模块的主要功能

  • 类型提示:为变量和函数参数指定预期类型。
  • 泛型类型:用参数定义类型,如List[int]。
  • 类型别名:为复杂类型创建别名以提高可读性。
  • 函数重载:定义函数的多种调用方式。
  • 类型检查:静态类型检查程序可以使用提示来验证类型的正确性。

最佳实践

在Python中,有效地使用typing模块能极大地增强代码的可读性、可维护性和健壮性。以下是利用这一强大功能的一些最佳实践:b0428资讯网——每日最新资讯28at.com

  • 从公共接口入手:首先为模块或类的公共接口添加类型提示,这些接口是代码的其他部分或外部用户要使用的函数、方法和类。
  • 挑选特定类型:若可能,挑选特定类型,而非通用类型。例如,首选List[int],别选择List,或者首选Dict[str,float],别选Dict。这种独特性提供了更清晰的对函数预期和返回的指导,因此使静态类型分析器能更好地进行错误检查。

为复杂类型创建类型别名:对于复杂或频繁使用的类型,请使用TypeVar和NewType函数创建类型别名。这不仅提升了可读性,而且使得日后重构或更改类型更方便。b0428资讯网——每日最新资讯28at.com

from typing import List, TypeVarUserId = NewType('UserId', int)Vector = TypeVar('Vector', List[float], List[int])
  • 逐步实行类型提示:Python 的类型系统设计的目标是渐进式的。您不用一次性注释所有代码。可以从最关键的部分开始,逐步增加覆盖范围。在大型现有代码库中,这种方法更加可行,因为在这些代码库中立即进行全面检修是不切实际的。
  • 对可为 null 的类型使用 Optional:当变量可能为 None 时,显式将其标记为 Optional。这种做法清楚地说明该变量可以具有 None 值,并强制您在代码中处理这种情况,因此可以防止看似合理却可能引起 NoneType错误的情况出现。
from typing import Optionaldef function(arg: Optional[int]) -> None:  ...
  • 利用类型检查工具:将 mypy 或 pyright 等工具中的类型检查纳入您的开发工作流程。将这些检查作为持续集成流程的一部分运行,以便在类型错误进入生产环境之前将其捕获。

总结

本文主要介绍了Python中的类型提示的概念、使用原因以及如何利用其优势。类型提示可明确代码意图、增强代码可读性、以及在运行代码之前捕获类型相关错误。typing模块则进一步扩展了Python的类型提示功能,可以指定集合中的项类型,从而提供更详细、更丰富的类型提示。通过有效地使用本文所述技术,可以大大提高代码的可读性、可维护性和健壮性。b0428资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-88344-0.html提升Python代码质量:类型提示的运用与实践

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Python编程技巧:那些年后悔没有早知道String模块的这些宝藏功能

下一篇: 面向未来的 Web 框架,更快、更小、更好用!

标签:
  • 热门焦点
  • 中兴AX5400Pro+上手体验:再升级 双2.5G网口+USB 3.0这次全都有

    中兴AX5400Pro+上手体验:再升级 双2.5G网口+USB 3.0这次全都有

    2021年11月的时候,中兴先后发布了两款路由器产品,中兴AX5400和中兴AX5400 Pro,从产品命名上就不难看出这是隶属于同一系列的,但在外观设计上这两款产品可以说是完全没一点关系
  • CSS单标签实现转转logo

    CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • Golang 中的 io 包详解:组合接口

    Golang 中的 io 包详解:组合接口

    io.ReadWriter// ReadWriter is the interface that groups the basic Read and Write methods.type ReadWriter interface { Reader Writer}是对Reader和Writer接口的组合,
  • 分布式系统中的CAP理论,面试必问,你理解了嘛?

    分布式系统中的CAP理论,面试必问,你理解了嘛?

    对于刚刚接触分布式系统的小伙伴们来说,一提起分布式系统,就感觉高大上,深不可测。而且看了很多书和视频还是一脸懵逼。这篇文章主要使用大白话的方式,带你理解一下分布式系统
  • 一篇聊聊Go错误封装机制

    一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • 19个 JavaScript 单行代码技巧,让你看起来像个专业人士

    19个 JavaScript 单行代码技巧,让你看起来像个专业人士

    今天这篇文章跟大家分享18个JS单行代码,你只需花几分钟时间,即可帮助您了解一些您可能不知道的 JS 知识,如果您已经知道了,就当作复习一下,古人云,温故而知新嘛。现在,我们就开始今
  • .NET 程序的 GDI 句柄泄露的再反思

    .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 讲故事上个月我写过一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,当时用的是 GDIView + WinDbg 把问题搞定,前者用来定位泄露资源,后者用来定位泄露代码,后面有朋友反
  • 新电商三兄弟,“抖快红”成团!

    新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的&ldquo;新电商三兄弟&rdquo;成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • 小米汽车电池信息疑似曝光:容量101kWh,支持800V高压快充

    小米汽车电池信息疑似曝光:容量101kWh,支持800V高压快充

    7月14日消息,今日一名博主在社交媒体发布了一张疑似小米汽车电池信息的照片,显示该电池包正是宁德时代麒麟电池,容量为101kWh,电压为726.7V,可以预测小
Top
Baidu
map