【Python】Python 3.13 中的 7 个新类型特性

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

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

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

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

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

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) 会通过明显的删除线提醒我:

60a9ac4d58e92fb3df8968f91fdfe08b.png
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,则 argTypeB的实例,如果返回 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 官方文档中提到,通过移除对 recontextlib 的依赖,typing 模块的导入时间减少了大约三分之一。

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

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

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

e337d790c8fcf70064187e4e3063064f.jpeg

往期精彩回顾




适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑
  • 交流群

请备注:”昵称-学校/公司-研究方向“,例如:”张小明-浙大-CV“加群。

也可以加入机器学习交流qq群772479961)

9c7266fcfa36121eb6f1cfe1994b22f6.png

<think>我们注意到用户想要安装Python 3.13.7版本,但引用的资料中提供的是3.13.0的安装方法。实际上,安装步骤是相似的,只是版本号不同。下面将分别介绍在Windows、Linux(以UOS为例)和macOS上安装Python 3.13.7的步骤。 ### Windows系统安装Python 3.13.7 1. **下载安装包** 访问Python官网下载页面: [https://www.python.org/downloads/](https://www.python.org/downloads/) 找到Python 3.13.7版本的Windows安装程序(通常为64位的可执行文件,如`python-3.13.7-amd64.exe`)。 或者,如果官网未直接提供3.13.7,可以到历史版本下载页面: [https://www.python.org/downloads/windows/](https://www.python.org/downloads/windows/) 在页面中查找3.13.7版本。 2. **运行安装程序** 双击下载的安装程序,按以下步骤操作: - 勾选“Add Python 3.13 to PATH”(将Python添加到环境变量),这样可以在命令行中直接使用python命令。 - 选择“Customize installation”(自定义安装)或“Install Now”(立即安装)。建议选择自定义安装,以确保安装所有组件。 - 在可选组件中,建议勾选“pip”和“py launcher”等。 - 点击“Install”开始安装。 3. **验证安装** 安装完成后,打开命令提示符(CMD)或PowerShell,输入: ```bash python --version ``` 如果显示`Python 3.13.7`,则安装成功。 ### Linux系统(以UOS为例)安装Python 3.13.7Linux系统中,我们通常通过源码编译安装。 1. **安装依赖** 打开终端,执行以下命令安装编译所需的依赖: ```bash sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev libsqlite3-dev libbz2-dev ``` 2. **下载源码包** 使用wget下载Python 3.13.7源码包: ```bash wget https://www.python.org/ftp/python/3.13.7/Python-3.13.7.tgz ``` 如果上述链接不可用,可以尝试: ```bash wget https://mirrors.aliyun.com/python-release/source/Python-3.13.7.tgz ``` 3. **解压并编译** ```bash tar -xvf Python-3.13.7.tgz cd Python-3.13.7 ./configure --enable-optimizations make -j8 # 使用8个核心进行编译,根据实际CPU核心数调整 sudo make altinstall # 使用altinstall避免覆盖系统默认的python命令 ``` 4. **验证安装** 编译安装完成后,输入: ```bash python3.13 --version ``` 应显示`Python 3.13.7`。 ### macOS系统安装Python 3.13.7 1. **使用Homebrew安装(推荐)** 如果你已经安装了Homebrew,只需执行: ```bash brew install python@3.13 ``` 但请注意,Homebrew可能不会立即更3.13.7,如果还没有更,可以尝试从源码安装。 2. **源码安装(类似Linux)** 步骤与Linux基本相同: - 安装依赖(可能需要安装Xcode命令行工具): ```bash xcode-select --install ``` - 下载源码并编译: ```bash wget https://www.python.org/ftp/python/3.13.7/Python-3.13.7.tgz tar -xvf Python-3.13.7.tgz cd Python-3.13.7 ./configure --enable-optimizations make -j8 sudo make altinstall ``` 3. **验证安装** 在终端输入: ```bash python3.13 --version ``` 应显示`Python 3.13.7`。 ### 注意事项 - 在Windows和macOS上,安装程序通常会自动添加环境变量,但Linux上需要手动添加(如果需要的话)。 - 使用`altinstall`(在Linux和macOS上)是为了避免覆盖系统自带的Python版本,这样系统命令(如yum等)不会受到影响。 - 如果遇到任何问题,请参考官方文档:[https://docs.python.org/3/using/index.html](https://docs.python.org/3/using/index.html) §§相关问题§§ 1. Python 3.13.7有哪些新特性? 2. 如何在同一台电脑上安装多个Python版本? 3. 安装Python后如何配置虚拟环境?</think>### Python 3.13.7 安装指南 Python 3.13.7 的安装方法因操作系统而异,以下是详细步骤: --- #### **Windows 系统安装** 1. **下载安装包** - 访问 [Python官网下载页](https://www.python.org/downloads/) - 找到 **Python 3.13.7** 的 Windows 安装包(如 `python-3.13.7-amd64.exe`) - 或直接使用镜像下载(速度更快): ```bash https://mirrors.aliyun.com/python/3.13.7/python-3.13.7-amd64.exe ``` 2. **运行安装程序** - 双击安装包,勾选 **"Add Python to PATH"**(关键步骤!) - 选择 **"Customize installation"** → 勾选所有可选组件(如 pip、py launcher) - 安装路径建议保持默认(如 `C:\Python313\`) 3. **验证安装** 打开命令提示符(CMD)执行: ```bash python --version # 应显示:Python 3.13.7 ``` --- #### **Linux 系统安装(以 UOS/Ubuntu 为例)** ```bash # 1. 安装依赖 sudo apt update sudo apt install build-essential zlib1g-dev libncurses5-dev libssl-dev # 2. 下载源码(使用阿里云镜像) wget https://mirrors.aliyun.com/python-release/source/Python-3.13.7.tgz tar -xzf Python-3.13.7.tgz cd Python-3.13.7 # 3. 编译安装(保留系统默认Python./configure --enable-optimizations --prefix=/usr/local/python3.13.7 make -j8 # 根据CPU核心数调整(如8核) sudo make altinstall # 关键:使用altinstall避免覆盖系统Python # 4. 验证 /usr/local/python3.13.7/bin/python3.13 --version ``` --- #### **macOS 系统安装** ```bash # 1. 通过Homebrew安装(推荐) brew install python@3.13 # 2. 或手动编译(步骤同Linux) # 注意:使用 --prefix 指定安装目录 ``` --- #### **环境变量配置(通用)** - **Windows**: 添加以下路径到系统变量 `PATH`: ``` C:\Python313\Scripts\ C:\Python313\ ``` [配置方法参考](^3) - **Linux/macOS**: 在 `~/.bashrc` 中添加: ```bash export PATH="/usr/local/python3.13.7/bin:$PATH" ``` --- #### **安装验证** ```bash # 检查版本 python3.13 --version # 测试pip pip3.13 install numpy python3.13 -c "import numpy; print(numpy.__version__)" ``` > ⚠️ 注意: > - 若系统已有其他Python版本,使用 `python3.13` 和 `pip3.13` 命令区分 > - 推荐使用虚拟环境:`python3.13 -m venv myenv`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值