如何在 Python 中提取 Annotated 类型提示中的元数据信息
发布时间 - 2026-01-05 00:00:00 点击率:次本文介绍如何通过 `__metadata__` 属性安全、准确地访问 `typing.annotated` 类型注解中嵌入的自定义对象(如文档类、验证器或配
置实例),避免字符串化陷阱,实现运行时元数据读取与使用。
在 Python 3.9+ 中,typing.Annotated 提供了一种为类型添加任意元数据的标准化方式。它不仅支持类型检查器识别基础类型(第一个参数),还将后续所有参数统一存储在 __metadata__ 元组中——这正是提取自定义对象(如文档类、校验规则或配置实例)的关键入口。
以下是一个完整示例,展示如何从 Annotated 注解中获取并使用元数据:
from typing import Annotated, get_args
import inspect
from dataclasses import dataclass
@dataclass
class Doc:
description: str
required: bool = True
@dataclass
class A:
name: Annotated[str, Doc("用户姓名", required=True)]
age: Annotated[int, Doc("用户年龄", required=False), "unit: years"]
# 获取运行时注解(自动求值字符串化注解)
annotations = inspect.get_annotations(A, eval_str=True)
# 提取 'name' 字段的 Annotated 类型
annotated_type = annotations["name"]
# ✅ 正确方式:访问 __metadata__ 属性(返回 tuple)
metadata = annotated_type.__metadata__
print(metadata) # (Doc(description='用户姓名', required=True),)
# 获取第一个元数据对象(通常为文档类)
doc_obj = metadata[0]
print(doc_obj.description) # 输出:用户姓名
# 同样适用于多参数场景(如 age 字段)
age_annotated = annotations["age"]
print(age_annotated.__metadata__) # (Doc(description='用户年龄', required=False), 'unit: years')⚠️ 注意事项:
- __metadata__ 是 Annotated 的只读公有属性,由标准库保证存在,无需导入额外模块;
- inspect.get_annotations(..., eval_str=True) 是关键:若注解以字符串形式存在(如 Annotated["str", ...]),必须启用 eval_str=True 才能获得真实类型对象,否则 __metadata__ 不可用;
- 不要尝试用 getattr(annotated_type, '__args__', []) 或 get_args() 替代 __metadata__——get_args(Annotated[T, x, y]) 返回 (T, x, y),会混入基础类型,而 __metadata__ 精确排除第一个参数,语义更清晰、更安全;
- 元数据对象本身需支持序列化/持久化(如 dataclass 或 NamedTuple),若含不可序列化状态(如 lambda、文件句柄),将影响调试与文档生成。
总结:Annotated[T, meta1, meta2].__metadata__ 是官方推荐、稳定可靠的元数据访问机制,适用于构建类型驱动的文档生成器、参数校验框架或 API 描述工具。掌握它,即可将类型注解真正转化为可执行的程序逻辑与用户友好的上下文信息。
立即学习“Python免费学习笔记(深入)”;
# python
# 工具
# 数据访问
# 标准库
# red
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何用y主机助手快速搭建网站?
JavaScript中如何操作剪贴板_ClipboardAPI怎么用
详解jQuery中基本的动画方法
Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案
Laravel任务队列怎么用_Laravel Queues异步处理任务提升应用性能
如何在阿里云虚拟机上搭建网站?步骤解析与避坑指南
制作电商网页,电商供应链怎么做?
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】
如何在万网ECS上快速搭建专属网站?
Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】
个人网站制作流程图片大全,个人网站如何注销?
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
香港服务器部署网站为何提示未备案?
香港服务器网站推广:SEO优化与外贸独立站搭建策略
如何在建站之星网店版论坛获取技术支持?
网站制作软件免费下载安装,有哪些免费下载的软件网站?
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】
魔毅自助建站系统:模板定制与SEO优化一键生成指南
公司网站制作价格怎么算,公司办个官网需要多少钱?
如何使用 jQuery 正确渲染 Instagram 风格的标签列表
Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用
长沙企业网站制作哪家好,长沙水业集团官方网站?
Linux安全能力提升路径_长期防护思维说明【指导】
详解Android中Activity的四大启动模式实验简述
网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
桂林网站制作公司有哪些,桂林马拉松怎么报名?
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
如何用AI帮你把自己的生活经历写成一个有趣的故事?
JavaScript中的标签模板是什么_它如何扩展字符串功能
zabbix利用python脚本发送报警邮件的方法
uc浏览器二维码扫描入口_uc浏览器扫码功能使用地址
公司网站制作需要多少钱,找人做公司网站需要多少钱?
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
Laravel如何升级到最新版本?(升级指南和步骤)
如何在阿里云虚拟主机上快速搭建个人网站?
儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?
如何登录建站主机?访问步骤全解析
网站制作大概多少钱一个,做一个平台网站大概多少钱?
微信公众帐号开发教程之图文消息全攻略
三星网站视频制作教程下载,三星w23网页如何全屏?
如何在宝塔面板中创建新站点?
LinuxCD持续部署教程_自动发布与回滚机制
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
长沙做网站要多少钱,长沙国安网络怎么样?
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案

