超赞的Python类型注解
收集了一系列很棒的Python类型、存根、插件以及与之相关的工具。
目录
静态类型检查器
- basedmypy - 基于基线功能的静态类型检查。
- basedpyright - Pyright的分支,改进了VSCode支持和其他各种修复。
- mypy - 可选静态类型检查(PEP 484)。
- pyanalyze - 可扩展的静态分析器和类型检查器。
- pycharm - 专业开发者的IDE。
- pylyzer - 用Rust编写的快速Python静态代码分析器和语言服务器。
- pyre - 高性能类型检查器。
- pyright - 快速类型检查器,适用于大型Python源代码库。它可以在"监视"模式下运行,并在文件修改时执行快速增量更新。
- pytype - 无需类型注解即可检查和推断类型的工具。
动态类型检查器
- beartype - 纯Python实现的超快O(1)运行时类型检查。
- pydantic - 使用Python类型提示进行数据解析。支持数据类。
- pytypes - 提供丰富的运行时类型检查工具集。
- strongtyping - 检查函数是否以正确类型参数调用的装饰器。
- typedpy - 类型安全、严格的Python。与标准Python配合良好。
- typeguard - 另一个运行时类型检查器。
- typical - 使用类型提示进行数据解析和自动类型转换。支持数据类、标准类、函数签名等。
- trycast - 解析由类型化字典(TypedDicts)和其他标准Python类型提示定义形状的类JSON值。
存根包
- asgiref - ASGI规范,提供asgiref.typing模块,包含ASGI服务器的类型注解。
- boto3-stubs - boto3的存根。
- botostubs - 在任何IDE中为任何boto3 API提供代码辅助。
- celery-types - Celery及其相关包的类型存根,包括django-celery-results、ampq、kombu、billiard、vine和ephem。
- django-stubs - Django的存根。
- djangorestframework-stubs - DRF的存根。
- grpc-stubs - grpc的存根。
- lxml-stubs - lxml的存根。
- PyQt5-stubs - PyQt5的存根。
- python-phonenumbers-stubs - phonenumbers的存根。
- pythonista-stubs - Pythonista的存根。
- sqlalchemy-stubs - SQLAlchemy的存根。
- sqlalchemy2-stubs - SQLAlchemy的官方存根和mypy插件。
- torchtyping - pytorch的增强类型注解。
- types-aiobotocore - aiobotocore的存根。
- typeshed - 带有静态类型的库存根集合。
附加类型
- meiga - 简单、类型化和基于单子的Result类型。
- option - 类似Rust的Option和Result类型。
- optype - 独特的
collections.abc
和operators
替代方案:灵活的单方法协议和具有可预测名称的类型化操作符。 - phantom-types - 幻影类型。
- returns - 使您的函数返回有意义、类型化和安全的结果。
- safetywrap - 完全类型安全的、类似Rust的Result和Option类型。
- typet - 长度受限的类型,动态对象验证。
- useful-types - 有用协议和类型别名的集合。
向后移植和改进
- future-typing - 标准集合中泛型类型提示和联合类型(如
X | Y
)的向后移植。 - typing-extensions - 向后移植和实验性类型提示。
- typing-utils - 向后移植3.8+运行时类型工具(例如:get_origin)并添加issubtype等功能。
工具
代码检查工具
- flake8-annotations-complexity - flake8 的插件,用于验证注解复杂度。
- flake8-annotations - flake8 的插件,用于检查函数定义中是否存在类型注解。
- flake8-pyi - Flake8 的插件,为类型提示存根文件提供专门化。
- flake8-type-checking - 插件,帮助你正确地保护任何仅用于类型注解的导入。
- flake8-typing-imports - 插件,检查 typing 导入是否被正确保护。
- flake8-typing-only-imports - flake8 插件,帮助识别哪些导入应放入类型检查块,以及在移动导入后如何调整类型注解。
- flake8-type-ignore - flake8 插件,禁止在你的类型化 Python 代码中使用 type: ignore 注释。
- wemake-python-styleguide - 有史以来最严格和最固执的 Python 代码检查工具。
- Ruff - 极快的代码检查工具,支持许多其他代码检查工具(如 flake8)的规则。
测试
- mypy-test - 测试 mypy 插件、存根和自定义类型。
- pytest-mypy-plugins - 用于测试 mypy 类型、存根和插件的 Pytest 插件。
- pytest-mypy-testing - 用于测试 mypy 静态类型分析的 Pytest 插件。
- pytest-mypy - Pytest 的 Mypy 静态类型检查器插件。
处理类型
- com2ann - 将类型注释转换为类型注解的工具。
- merge-pyi - pytype 工具链的一部分,将存根文件应用到源代码上。
- mypy-baseline - 将 mypy 与现有代码库集成。一个 CLI 工具,过滤掉现有的类型错误,只报告新的错误。
- mypy-protobuf - 从 protobuf 生成 mypy 存根的工具。
- mypy-silent - 通过添加或删除代码注释来使 mypy 保持静默。
- mypyc - 将带有 mypy 注解的、静态类型化的 Python 模块编译成 CPython C 扩展。
- retype - 另一个将存根应用到代码的工具。
- typeforce - CLI 工具,通过类型注解丰富你的 Python 环境,增强 mypy 的功能。
- typesplainer - Python 类型解释器。
- typing-inspect - typing_inspect 模块定义了用于运行时检查
typing
模块中定义的类型的实验性 API。 - typing-json - 用于处理类型化对象和 JSON 的库。
为现有代码添加注解的辅助工具
- autotyping - 自动为函数添加简单的返回类型注解(bool、None、Optional)。
- infer-types - 自动推断并为Python代码添加类型注解的命令行工具。
- jsonschema-gentypes - 基于JSON Schema生成Python类型(基于TypedDict)。
- monkeytype - 收集函数参数和返回值的运行时类型,可以自动生成存根文件,甚至直接根据运行时收集的类型向代码添加类型注解草稿。
- no_implicit_optional - 一个代码修改工具,使隐式可选类型提示符合PEP 484规范。
- pyannotate - 根据运行时观察到的调用参数和返回类型,向源代码插入注解。
- PyTypes - 通过Python跟踪推断类型。
- pyre infer - Pyre具有强大的功能,可将代码库迁移到类型化格式。infer命令行选项可以读取文件或目录,对使用的类型进行educated猜测,并将注解应用到文件中。
- pytest-annotate - pytest的Pyannotate插件。
- pytest-monkeytype - pytest的MonkeyType插件。
- pytype annotate-ast - 一个正在开发中的工具,用于为AST节点添加Python类型注解。
- type4py - 基于深度相似性学习的类型推断。
- typilus - 用于预测Python类型的深度学习算法。也可作为GitHub action使用。
- auto-optional - 当默认参数为
None
时,将类型化参数变为Optional。
Mypy插件
- kubernetes-typed - 用于Kubernetes CRD类型检查的插件。
- loguru-mypy - 用于支持loguru的插件。
- mypy-zope - 用于支持zope.interface的插件。
- mypy/plugins - 已集成到mypy中的插件。
- numpy - 用于支持NumPy的插件。
- pynamodb-mypy - 用于支持PynamoDB的插件。
集成
- emacs-flycheck-mypy - Emacs的mypy集成。
- mypy-playground - mypy在线试验场。
- mypy-pycharm-plugin - PyCharm的mypy集成。
- pylance - VSCode的PyRight集成。
- vim-mypy - Vim的mypy集成。
- nbQA - 在Jupyter Notebooks上运行类型检查器(如Mypy)。
文章
PEPs
- PEP-3107 - 函数注解
- PEP-482 - 类型提示文献概述
- PEP-483 - 类型提示理论
- PEP-484 - 类型提示
- PEP-526 - 变量注解语法
- PEP-544 - 协议:结构化子类型(静态鸭子类型)
- PEP-557 - 数据类
- PEP-560 - typing模块和泛型类型的核心支持
- PEP-561 - 类型信息的分发和打包
- PEP-563 - 注解的延迟评估
- PEP-585 - 标准集合中的类型提示泛型
- PEP-586 - 字面类型
- PEP-589 - TypedDict:具有固定键集的字典的类型提示
- PEP-591 - 向typing添加final限定符
- PEP-593 - 灵活的函数和变量注解
- PEP-604 - Union[]的补充语法
- PEP-612 - 参数规范变量
- PEP-613 - 显式类型别名
第三方文章
- Python中真正常量的1分钟指南 - 关于
Final
常量和继承的完整教程 - Python中的简单依赖类型 - 关于
Literal
类型的完整教程 - 测试mypy存根、插件和类型 - 关于测试mypy类型的完整教程
- 我们为400万行Python代码添加类型检查的历程 - Dropbox是首批在如此大规模上采用Python静态类型检查的公司之一
- PyTest MonkeyType介绍 - 使用MonkeyType为现有Python Django代码库添加类型注解
- Python中类型提示的现状 - 截至2018年5月
- 类型提示速查表 - MyPy团队编写的类型注解速查表
- 对Django和DRF进行类型检查 - 关于对django进行类型检查的完整教程
- 为你的Django应用程序进行类型检查 - 基于两个最近关于向Django添加类型检查的演讲的文章
- typing -
typing
模块的官方Python文档 - Python-typing-koans - 一组学习Python可选静态类型的示例
- Python类型检查(指南) - 在本指南中,你将了解Python类型检查
- 为urllib3添加类型提示 - 测试还不够:为urllib3添加类型提示的案例研究
- Adam Johnson的博客 - Adam Johnson博客中关于类型实践的内容
- ParamSpec指南 -
PEP612
中新发布的功能允许你对函数及其签名进行许多高级类型操作 - Python装饰器的静态类型 - 在Python中准确地为装饰器添加静态类型是一件棘手的事情。包装函数模糊了静态确定被包装函数的参数和返回值类型所需的类型信息
社区
- python/typing - 官方typing Gitter聊天室
- TypedDjango - 官方组织Gitter聊天室
- PythonRu#typing - 俄罗斯Slack聊天室(邀请在这里)关于类型
相关
- awesome-python - 精选的Python框架、库、软件和资源列表
- python-typecheckers - Python类型检查器列表:静态和运行时