typing.Self 如何在 Python 3.11 前用 typing_extensions 回退

冷漠man

冷漠man

2026-01-28

768人浏览

原创

typing.Self 在 Python 3.11 才正式引入,3.10 及更早需用 typing_extensions>=4.2.0 的 Self 替代,并确保 mypy>=0.980,统一导入、显式标注、禁用字符串前向引用以保障链式调用类型推导正确。

typing.self 如何在 python 3.11 前用 typing_extensions 回退

typing.Self 在 Python 3.11 前不可用,必须回退

Python 3.11 才正式引入 typing.Self,3.10 及更早版本中直接使用会触发 NameError: name 'Self' is not defined 或类型检查器(如 mypy)报错 error: Name "Self" is not defined。不能靠条件导入 typing.Self 来“兼容”,因为 AST 解析阶段就失败了。

用 typing_extensions.Self 替代,但需满足版本要求

typing_extensions 从 v4.2.0 开始支持 Self(对应 PEP 673),且仅在 Python 3.7+ 上可用。低于 v4.2.0 的版本(如常见于旧项目中的 v3.7.4)不包含该符号,强行导入会报 ImportError: cannot import name 'Self' from 'typing_extensions'

  • 确认已安装 ≥v4.2.0:pip install "typing_extensions>=4.2.0"
  • 统一用 from typing_extensions import Self,**不要**写成 from typing import Self(3.10- 会炸)
  • mypy 需 ≥v0.980(否则不认识 Self 语义),pyright/pylance 通常较新,基本无碍

类内方法返回 Self 的写法要一致

回退后写法和 3.11+ 完全一致,类型检查器能正确推导链式调用。关键点是:所有涉及返回当前实例的方法,都必须显式标注返回类型为 Self,且不能混用字符串前向引用(如 "MyClass")——那会丢失协变性,破坏链式调用推导。

ApiPost接口调试与文档生成工具
ApiPost接口调试与文档生成工具

ApiPost是一个支持团队协作,支持模拟POST、GET、PUT等常见请求,并可直接生成文档的API调试、管理工具,ApiPost是后台接口开发者或前端、接口测试人员的工作必备工具。快速生成、一键导出API文档。感兴趣的朋友快来下载吧。软件说明ApiPost官方版是一款十分出色的接口调试与文档生成工具,ApiPost官方版界面美观大方,功能强劲实用,支持团队协作,支持模拟POST、GET、PUT等常见请求,是后台接口开发者或前端、接口测试人员的工作必备工具。软件特色更方便支持接口调试的同时快速生成、一键

下载
from typing_extensions import Self
<p>class Box:
def <strong>init</strong>(self, value: int) -> None:
self.value = value</p><pre class="brush:php;toolbar:false;">def set_value(self, v: int) -> Self:
    self.value = v
    return self

def double(self) -> Self:
    self.value *= 2
    return self

类型检查器能正确识别 b.double().set_value(42) 是 Box 实例

b = Box(10).double().set_value(42)

注意 mypy 的 --enable-error-code 和插件干扰

某些旧版 mypy 插件(如 mypy-zope 或自定义插件)可能未适配 Self,导致误报 error: Invalid self type。若遇到这类错误:

  • 先关掉插件验证是否消失:mypy --no-plugins your_file.py
  • 确保 mypy ≥0.980 且 typing_extensions ≥4.2.0
  • 避免在泛型类中对 Self 做子类约束(如 def method(self) -> Self[T]),这在 typing_extensions 中尚未完全支持,容易触发内部错误

Self 的核心价值是让类型系统理解“返回的是调用者的精确类型”,而不是粗粒度的类名字符串;回退方案本身很干净,但版本锁和工具链对齐是实际落地时最容易卡住的地方。

Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

python

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

2023.10.09

1230

5

更新pip版本
更新pip版本

更新pip版本方法有使用pip自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。

2024.12.20

2418

6

pip设置清华源
pip设置清华源

设置方法:1、打开终端或命令提示符窗口;2、运行“touch ~/.pip/pip.conf”命令创建一个名为pip的配置文件;3、打开pip.conf文件,然后添加“[global];index-url = https://pypi.tuna.tsinghua.edu.cn/simple”内容,这将把pip的镜像源设置为清华大学的镜像源;4、保存并关闭文件即可。

2024.12.23

3057

11

python升级pip
python升级pip

本专题整合了python升级pip相关教程,阅读下面的文章了解更多详细内容。

2025.07.23

1597

16

pip安装使用方法
pip安装使用方法

安装步骤:1、确保Python已经正确安装在您的计算机上;2、下载“get-pip.py”脚本;3、按下Win + R键,然后输入cmd并按下Enter键来打开命令行窗口;4、在命令行窗口中,使用cd命令切换到“get-pip.py”所在的目录;5、执行安装命令;6、验证安装结果即可。大家可以访问本专题下的文章,了解pip安装使用方法的更多内容。

2023.10.09

1230

5

更新pip版本
更新pip版本

更新pip版本方法有使用pip自身更新、使用操作系统自带的包管理工具、使用python包管理工具、手动安装最新版本。想了解更多相关的内容,请阅读专题下面的文章。

2024.12.20

2418

6

pip设置清华源
pip设置清华源

设置方法:1、打开终端或命令提示符窗口;2、运行“touch ~/.pip/pip.conf”命令创建一个名为pip的配置文件;3、打开pip.conf文件,然后添加“[global];index-url = https://pypi.tuna.tsinghua.edu.cn/simple”内容,这将把pip的镜像源设置为清华大学的镜像源;4、保存并关闭文件即可。

2024.12.23

3057

11

python升级pip
python升级pip

本专题整合了python升级pip相关教程,阅读下面的文章了解更多详细内容。

2025.07.23

1597

16

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.18

639

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PyCharm官方快速入门指南
PyCharm官方快速入门指南

共0课时 | 0人学习

Python函数定义官方教程
Python函数定义官方教程

共0课时 | 0人学习

Python 3.14.6官方文档
Python 3.14.6官方文档

共0课时 | 0人学习