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

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

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

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

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

使用类型提示的原因

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

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

虽然这种做法具有一定的优点,但是也可能会产生潜在的错误和误解,尤其是在处理大型代码库或与团队协作时。例如:tBr28资讯网——每日最新资讯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 引入了称为‘类型提示’的可选功能。tBr28资讯网——每日最新资讯28at.com

Python 类型提示是什么?

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

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

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

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

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

类型提示的好处

增强了代码的可读性

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

错误检测

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

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

更好地支持 IDE

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

自我记录代码

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

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

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

typing模块

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

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

例如:tBr28资讯网——每日最新资讯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运行时会忽略此提示:tBr28资讯网——每日最新资讯28at.com

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

typing模块的主要功能

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

最佳实践

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

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

为复杂类型创建类型别名:对于复杂或频繁使用的类型,请使用TypeVar和NewType函数创建类型别名。这不仅提升了可读性,而且使得日后重构或更改类型更方便。tBr28资讯网——每日最新资讯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的类型提示功能,可以指定集合中的项类型,从而提供更详细、更丰富的类型提示。通过有效地使用本文所述技术,可以大大提高代码的可读性、可维护性和健壮性。tBr28资讯网——每日最新资讯28at.com

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

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

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

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

标签:
  • 热门焦点
  • 官方承诺:K60至尊版将会首批升级MIUI 15

    官方承诺:K60至尊版将会首批升级MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版将会搭载天玑9200+处理器和独显芯片X7的同时,Redmi给出了官方承诺,K60至尊重大更新首批升级,会首批推送MIUI 15。也就是说虽然
  • 直屏旗舰来了 iQOO 12和K70 Pro同台竞技

    直屏旗舰来了 iQOO 12和K70 Pro同台竞技

    旗舰机基本上使用的都是双曲面屏幕,这就让很多喜欢直屏的爱好者在苦等一款直屏旗舰,这次,你们等到了。据博主数码闲聊站带来的最新爆料称,Redmi下代旗舰K70 Pro和iQOO 12两款手
  • 一年经验在二线城市面试后端的经验分享

    一年经验在二线城市面试后端的经验分享

    忠告这篇文章只适合2年内工作经验、甚至没有工作经验的朋友阅读。如果你是2年以上工作经验,请果断划走,对你没啥帮助~主人公这篇文章内容来自 「升职加薪」星球星友 的投稿,坐
  • 每天一道面试题-CPU伪共享

    每天一道面试题-CPU伪共享

    前言:了不起:又到了每天一到面试题的时候了!学弟,最近学习的怎么样啊 了不起学弟:最近学习的还不错,每天都在学习,每天都在进步! 了不起:那你最近学习的什么呢? 了不起学弟:最近在学习C
  • 腾讯盖楼,字节拆墙

    腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之&ldquo;想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!&rdquo;曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • 三星折叠屏手机去年销售近1000万台 今年目标定为1500万

    三星折叠屏手机去年销售近1000万台 今年目标定为1500万

    7月29日消息,三星率先发力可折叠手机市场,在全球市场已经取得了非常亮眼的成绩,接下来会进一步巩固和扩大这一优势。三星在推出Galaxy Z Flip5和Galax
  • 支持aptX Lossless无损传输 iQOO TWS 1赛道版发布限时优惠价369元

    支持aptX Lossless无损传输 iQOO TWS 1赛道版发布限时优惠价369元

    2023年7月4日,“无损音质,声动人心”iQOO TWS 1正式发布,支持aptX Lossless无损传输,限时优惠价369元。iQOO TWS 1耳机率先支持端到端aptX Lossless无
  • iQOO Neo8 Pro评测:旗舰双芯加持 最强性能游戏旗舰

    iQOO Neo8 Pro评测:旗舰双芯加持 最强性能游戏旗舰

    【Techweb评测】去年10月,iQOO推出了一款Neo7手机,该机搭载了联发科天玑9000+,配备独显芯片Pro+,带来了同价位段最佳的游戏体验,一经上市便受到了诸多用
  • 世界人工智能大会国际日开幕式活动在世博展览馆开启

    世界人工智能大会国际日开幕式活动在世博展览馆开启

    30日上午,世界人工智能大会国际日开幕式活动在世博展览馆开启,聚集国际城市代表、重量级院士专家、国际创新企业代表,共同打造人工智能交流平台。上海市副市
Top