拓冰建站拓冰建站
首页 / 资讯中心 / 正文

从入门到上手:annotated-types 五大核心约束 Gt/Ge/Lt/Le/Len 实战教程

从入门到上手annotated-types 五大核心约束 Gt/Ge/Lt/Le/Len 实战教程【免费下载链接】annotated-typesReusable constraint types to use with typing.Annotated项目地址: https://gitcode.com/gh_mirrors/an/annotated-typesannotated-types是一个专为 Pythontyping.Annotated设计的约束类型库提供 Gt、Ge、Lt、Le、Len 等可复用的边界与长度约束元数据帮你以一行注解声明大于 18、长度 4 到 6这类规则是 Pydantic 等数据校验生态的底层基石。本文带你从安装到实战30 分钟轻松上手。什么是 annotated-types为什么值得学Python 的 PEP-593 引入了typing.Annotated允许在类型上挂载额外的元数据。但元数据写什么、怎么写才有通用性这正是 annotated-types 要解决的问题。它由 Pydantic 与 Hypothesis 的核心维护者在 PyCon 2022 冲刺活动中共同设计详见 README.md 末尾的 Design History 一节目标只有四个字简单、通用。它的关键特点零运行时校验——只做约束描述不做检查性能开销几乎为零生态通用——Pydantic、Hypothesis 等下游库都能读懂这些约束刻意精简——只覆盖最常见场景其余约束鼓励你下游自定义 你可以把它理解为给类型加说明书而不是加检查器。快速安装一条命令开始 annotated-types 上手项目要求 Python 3.10 及以上见 pyproject.toml 的requires-python配置。安装只需一行pip install annotated-types当前稳定版本为0.8.0定义在 annotated_types/init.py 的__version__中。五大核心约束速查表在动手之前先看这张 annotated-types 约束速查表覆盖最常用的五个约束约束含义等价理解典型场景Gt(x)值必须大于x排他最小值exclusive minimum年龄 18Ge(x)值必须大于等于x包含最小值inclusive minimum价格 ≥ 0Lt(x)值必须小于x排他最大值exclusive maximum温度 100Le(x)值必须小于等于x包含最大值inclusive maximum评分 ≤ 5Len(a, b)长度在 a 到 b 之间两端均包含a len(value) b列表长度 4~6记忆技巧G GreaterL Less前两个管下限后两个管上限带等用 Ge/Le不带等用 Gt/Lt。Gt 与 Ge 实战给数值设一个下限Gt和Ge是所有可比较类型通用的最小值约束——数字、日期、字符串、集合都可以。from typing import Annotated from annotated_types import Gt, Ge age: Annotated[int, Gt(18)] # 合法19, 20... 非法17, 18 price: Annotated[float, Ge(0)] # 价格不能为负数一个容易忽略的实用技巧边界值的类型可以和被注解类型不同只要它们可比较。例如Annotated[int, Gt(1.5)]完全合法含义是大于 1.5 的整数即 2、3、4...。源码中对这一点的实现见 annotated_types/init.py 的Gt、Ge类约第 99~118 行。Lt 与 Le 实战给数值设一个上限Lt和Le与前面完全对称分别表示排他和包含的上限from annotated_types import Lt, Le score: Annotated[int, Le(100)] # 百分制100 分合法 progress: Annotated[float, Lt(1)] # 进度条小于 1未满实战中更常见的是上下限搭配使用。此时不必写两个注解可以用Interval一次性表达from annotated_types import Interval Annotated[int, Interval(ge1, le100)] # 1 值 100Interval会自动展开为对应的Ge/Le等单边界约束对下游库来说效果完全一致。Len 实战约束字符串、列表的长度Len作用于任何支持len()的类型——字符串、列表、字典、元组都行且上下限均包含from annotated_types import Len nickname: Annotated[str, Len(2, 20)] # 昵称 2~20 个字符 tags: Annotated[list[str], Len(1, 5)] # 标签至少 1 个最多 5 个 code: Annotated[str, Len(6, 6)] # 恰好 6 位验证码、邮编等只想约束单边时用更直观的MinLen/MaxLen更好Annotated[list[int], MaxLen(10)] # 长度不超过 10 Annotated[list[int], MinLen(3)] # 长度至少 3⚠️版本注意v0.4.0 中Len做过一次破坏性变更——max_exclusive不含上限被改名为max_length且语义变为包含上限。如果你维护的是老代码升级前建议查阅 README 中的 Changed in v0.4.0 小节。完整示例一个带约束的用户模型把五大约束组合起来就是一个典型的实战场景from typing import Annotated, List from annotated_types import Gt, Ge, Le, Len class UserProfile: age: Annotated[int, Gt(0), Le(150)] # 年龄 0~150含边界 nickname: Annotated[str, Len(2, 20)] # 昵称 2~20 字符 balance: Annotated[float, Ge(0)] # 余额不为负 tags: Annotated[List[str], Len(0, 5)] # 标签 0~5 个如果配合 Pydantic 等校验库这些注解会在运行时自动生效非法值会被拦截并给出清晰的错误提示——你只需声明无需检查。进阶读懂与扩展这些约束两个值得了解的设计能让你的代码与生态更兼容BaseMetadata所有基础约束的公共基类。下游库遍历注解时可用isinstance(x, BaseMetadata)识别约束这正是校验器识别约束的核心入口参考 tests/test_main.py 中get_constraints的实现。GroupedMetadataInterval和Len本身实现了该协议可被下游库自动解包成单约束。如果你的库想提供Field(ge1, le100)这类糖继承GroupedMetadata并实现__iter__即可无缝融入生态。更多约束如MultipleOf整除、Timezone时区、Predicate自定义函数校验、Unit物理单位也已在 annotated_types/init.py 中提供本文聚焦五大核心其余可随需查阅。常见问题FAQQ1annotated-types 会帮我做运行时校验吗不会。它只定义约束元数据本身校验由 Pydantic 等下游库完成。这是刻意的性能设计。Q2Annotated[int, Len(3)]这样用可以吗不可以。Len只适用于支持len()的类型对int使用是无效组合下游库可能报错或忽略——请避免这类误用。Q3不想依赖这个包有替代写法吗可以。官方建议实现方将functools.partial(operator.le, 1.5)这类可调用对象视为等价约束便于零依赖场景使用。总结annotated-types 上手路线图阶段动作关键收获1️⃣ 安装pip install annotated-types一条命令零配置2️⃣ 记表记住 Gt/Ge/Lt/Le/Len 速查表覆盖 90% 的日常约束需求3️⃣ 组合用Interval、多约束叠加写出简洁的类型声明4️⃣ 进阶了解 BaseMetadata 与 GroupedMetadata与 Pydantic 等生态深度互通annotated-types 的设计哲学是少即是多它不试图替代任何校验框架而是为整个 Python 注解生态提供了一套人人能懂、处处通用的约束语言。掌握本文的五大核心约束你就已经具备了在项目中规范表达数据边界的全部能力 【免费下载链接】annotated-typesReusable constraint types to use with typing.Annotated项目地址: https://gitcode.com/gh_mirrors/an/annotated-types创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门