当前位置: 首页 > article >正文

Python 3.13 中的 7 个新类型特性

刚刚发布的 Python 3.13 继续挑战了效率和优雅的极限。

除了在 Python 社区讨论已久的令人兴奋的自由线程模式 和 Just-In-Time 编译器之外,吸引我的还有类型系统的新改进。

在早期版本引入的强大类型系统基础上,Python 3.13 将引入七个新的类型特性,有望提高代码的可靠性和开发人员的工作效率。

在本文中,我们将尝试这些令人兴奋的新特性,并探索它们如何简化我们的代码并将我们的编程实践提升到新的高度。

本文中的所有代码片段都是在 Python 3.13.0rc2 的最新发布版本上测试的,该版本是 Python 3.13 的最终发布预览版。3.13.0 的正式版本于 2024 年 10 月 1 日星期二发布。

这里插播一条粉丝福利,如果你正在学习Python或者有计划学习Python,想要突破自我,对未来十分迷茫的,可以点击这里获取最新的Python学习资料和学习路线规划(免费分享,记得关注) 

1. ReadOnly类型

将项目定义为只读

新的 ReadOnly 类型,顾名思义,是一种特殊的类型构造,用于将 TypedDict 中的项目标记为只读。

from typing import TypedDict, ReadOnly

class Leader(TypedDict):
    name: ReadOnly[str]
    age: int

author: Leader = {'name': 'Yang Zhou', 'age': 30}
author['age'] = 31  # no problem to change
author['name'] = 'Yang'  # Type check error: "name" is read-only

上面的代码展示了它的用法。由于我们将 name 属性定义为 ReadOnly[str]类型,因此更改其值将在集成开发环境或其他静态类型检查工具中调用类型不一致提示。

注意:“ReadOnly” 类型只能在 “TypedDict” 中使用。

如果你喜欢更简单的 TypedDict 定义方式,也可以使用 ReadOnly 类型:

from typing import TypedDict, ReadOnly

Leader = TypedDict("Leader", {"name": ReadOnly[str], "age": int})

author: Leader = {'name': 'Yang Zhou', 'age': 30}
author['age'] = 31  # no problem to change
author['name'] = 'Tim'  # Type check error: "name" is read-only

2. @warnings.deprecated

新的装饰器,用于指示对象已被弃用

好的软件会不断改进。这不仅意味着添加新内容,还意味着删除过时的内容。

然而,在下一个新版本中直接删除函数或类的做法对用户来说不够友好。我们不应该这样做。

如果您严格遵守 Python 的官方文档。你会发现 Python 逐步删除无用对象的策略才是行业标准:

  • 将相对的对象标记为废弃对象,提前告知开发者将来会删除哪些对象。但这些对象仍然可以在接下来的几个版本中使用。

  • 几个版本之后,完全知情的对象将从 Python 的最新版本中完全移除。

Python 3.13 为我们提供了一种更方便的方法来标记被废弃的对象 - 一个新的 decorator,名为 @warings.deprecated

只要一个对象配备了这个装饰器,静态类型检查工具或集成开发环境就会提醒我们使用已废弃对象。

例如,我在下面的程序中使用了一个已废弃的对象,集成开发环境 (PyCharm) 会通过明显的删除线提醒我:

A PyCharm screenshot to show how the deprecated decorator works

简单易用,意义非凡,这又是一个经典的 Pythonic 设计!

3. TypeIs

让类型缩小更容易

新的 “TypeIs” 概念旨在 “类型缩小”(type narrowing),其官方文档中描述“类型缩小”是静态类型检查器用来确定程序代码流中表达式的更精确类型的一种技术。

而我们的应用代码中使用它的几率并不高。但我们需要了解它是什么:

简而言之,形式 def foo(arg: TypeA) -> TypeIs[TypeB]: ...,意味着如果 foo(arg) 返回 True,则 arg 是 TypeB的实例,如果返回 False,则它不是 TypeB的实例。

4.is_protocol

快速检查类是否属于协议类型的新函数

这个新函数 is_protocol 是检查对象是否为 Protocol 类型的便捷方法。

我们只需从 typing 模块中导入该函数并直接使用即可:

from typing import is_protocol, Protocol


class PersonProto(Protocol):
    name: str
    age: int

print(is_protocol(PersonProto))
# True
print(is_protocol(int))
# False

5.get_protocol_members

返回协议成员集合函数

新的 get_protocol_members() 函数用于快速获取一个 Protocol 类型的所有项目名称。它返回一个包含所有名称的 frozenset

from typing import Protocol, get_protocol_members


类 PersonProto(Protocol):
    name: str
    age: int

print(get_protocol_members(PersonProto))
# frozenset({'age', 'name'})

6. TypeVar、ParamSpec 和 TypeVarTuple 的默认类型

在 Python 3.13 中,类型参数 (typing.TypeVar、typing.ParamSpec 和 typing.TypeVarTuple 现在支持默认类型。其用法非常简单。

例如,下面的代码显示了如何轻松地将默认类型设置为 TypeVar

from typing import TypeVar
T = TypeVar("T", default=int)  # This means that if no type is specified T is int
print(T.has_default())
# True
S = TypeVar("S")
print(S.has_default())
# False

Python 3.13 还添加了 has_default() 函数来检查 TypeVar 是否有缺省类型。

7. NoDefault

表示没有默认值

除了为一些新的类型参数提供默认支持外,typing 模块还提供了一个名为 NoDefault 的新对象,用于指示类型参数没有默认值。

from typing import TypeVar, NoDefault
T = TypeVar("T")
print(T.__default__ is NoDefault)
# True

S = TypeVar("S", default=None)
print(S.__default__ is NoDefault)
# False

正如上面的代码所证明的,如果没有类型被设置为默认值,那么 TypeVar 的 __default__ 属性将是 NoDefault。但如果它的默认值是 None,它仍然有默认值。

性能改进和方法删除

Python 3.13 官方文档中提到,通过移除对 re 和 contextlib 的依赖,typing 模块的导入时间减少了大约三分之一。

我们还需要注意的是,从这个新 Python 版本开始,一些与键入相关的东西将被移除:

删除 typing.io 和 typing.re 命名空间,它们自 Python 3.8 起已被弃用。这些命名空间中的项可以直接从 typing 模块导入。

删除创建 TypedDict 类型的关键字参数方法,该方法在 Python 3.11 中已被弃用。

最后,我精心筹备了一份全面的Python学习大礼包,完全免费分享给每一位渴望成长、希望突破自我现状却略感迷茫的朋友。无论您是编程新手还是希望深化技能的开发者,都欢迎加入我们的学习之旅,共同交流进步!

🌟 学习大礼包包含内容:

Python全领域学习路线图:一目了然,指引您从基础到进阶,再到专业领域的每一步学习路径,明确各方向的核心知识点。

超百节Python精品视频课程:涵盖Python编程的必备基础知识、高效爬虫技术、以及深入的数据分析技能,让您技能全面升级。

实战案例集锦:精选超过100个实战项目案例,从理论到实践,让您在解决实际问题的过程中,深化理解,提升编程能力。

华为独家Python漫画教程:创新学习方式,以轻松幽默的漫画形式,让您随时随地,利用碎片时间也能高效学习Python。

互联网企业Python面试真题集:精选历年知名互联网企业面试真题,助您提前备战,面试准备更充分,职场晋升更顺利。

👉 立即领取方式:只需【点击这里】,即刻解锁您的Python学习新篇章!让我们携手并进,在编程的海洋里探索无限可能


http://www.kler.cn/news/353264.html

相关文章:

  • 使用QueryWrapper中IN关键字超过1000个参数后如何处理
  • 数据结构——广义表
  • juzigei/基于Java语言的充电桩系统(充电桩小程序+充电桩管理平台)
  • html+css+js实现Notification 通知
  • 【二】企业级JavaScript开发之代码编辑器
  • [枚举坤坤]二进制枚举基础
  • 第五课:Python学习之if语句
  • 小型洗衣机什么牌子好又便宜?诚意盘点五款绝佳内衣洗衣机!
  • 【开源免费】基于SpringBoot+Vue.JS时装购物系统(JAVA毕业设计)
  • 复试经验分享《三、计算机学科专业基础综合》- 数据结构篇
  • 现场驻场运维人员安全管理制度模板
  • Android Back 键与Home键相互作用效果
  • 视频质量评价算法 DVQA 介绍
  • SpringCloud学习:Micrometer链路追踪 + GateWay网关
  • 【每日一题】Leetcode每日一题 - 两数相加
  • Chrome DevTools 一:简介 Console (入门必看)
  • nn.Conv2d(二)
  • 【Vue.js设计与实现】阅读笔记目录(持续更新)
  • 使用scss生成旋转圆圈
  • Python 面向对象编程 (OOP) 深入解析
  • windows10系统-使用自定义字体
  • SPSS 分类模型实训步骤 (以 Logistic 回归为例)
  • 单链表和双向链表区别 and 双向链表的增删改查!
  • GC1272替代APX9172/茂达中可应用于电脑散热风扇应用分析
  • STM32——USART原理及应用
  • Springboot + zset + lua 实现滑动窗口