讲师中心 微信公众号
AI工具推荐 视频效率加速

Python 中基于 TypedDict 的构造函数签名继承与泛型参数过滤实践

大辰姑娘_6293

大辰姑娘_6293

发布时间:2026-02-15 16:36:11

|

843人浏览过

|

来源于php中文网

原创

Python 中基于 TypedDict 的构造函数签名继承与泛型参数过滤实践

本文介绍如何通过抽象基类实现多个 typeddict 类型的构造函数逻辑复用,利用类属性动态指定允许的字段集,避免重复代码,同时保持类型安全和运行时字段过滤能力。

本文介绍如何通过抽象基类实现多个 typeddict 类型的构造函数逻辑复用,利用类属性动态指定允许的字段集,避免重复代码,同时保持类型安全和运行时字段过滤能力。

在 Python 类型驱动开发中,TypedDict 是表达结构化字典类型的重要工具,而当多个类需基于不同 TypedDict 接收并校验 **kwargs 时,直接复制构造函数逻辑会导致维护困难。理想方案是提取共用初始化逻辑至基类,并让子类声明其专属的字段白名单——这正是“签名继承”的核心诉求。

以下是一个简洁、可扩展且类型友好的实现:

from typing import TypedDict, Union, Unpack, Dict, Any

class TypeFilter1(TypedDict):
    c: str
    d: float

class TypeFilter2(TypedDict):
    e: float
    f: int

# 支持 N 个 TypedDict 的通用基类
class BaseClass:
    # 子类必须覆写此属性,值为对应 TypedDict.__annotations__
    ALLOWED_FIELDS: Dict[str, Any] = {}

    def __init__(self, **kwargs: Union[Unpack[TypeFilter1], Unpack[TypeFilter2]]) -> None:
        filtered = self._filter_kwargs(kwargs)
        self.filters = [f"{k}:{v}" for k, v in filtered.items()]
        self.params = " ".join(self.filters)

    def _filter_kwargs(self, kwargs: Dict[str, Any]) -> Dict[str, Any]:
        """按子类声明的 ALLOWED_FIELDS 过滤 kwargs,仅保留合法键"""
        return {k: v for k, v in kwargs.items() if k in self.ALLOWED_FIELDS}

class MyClass1(BaseClass):
    ALLOWED_FIELDS = TypeFilter1.__annotations__

class MyClass2(BaseClass):
    ALLOWED_FIELDS = TypeFilter2.__annotations__

✅ 使用示例:

a = MyClass1(c="hello", d=2.0)     # params → "c:hello d:2.0"
b = MyClass2(e=2.1, f=42, g=999)   # params → "e:2.1 f:42"(g 被自动忽略)

? 关键设计说明:

macOS UI 自动化技能包 —— 用 Python 控制你的 Mac
macOS UI 自动化技能包 —— 用 Python 控制你的 Mac

让 macOS 自动化像说话一样简单 —— 用代码控制你的 Mac,无需学习 AppleScript 系统要求 macOS 14+ (Sonoma) Python 3.9+ 需要开启:辅助功能 + 屏幕录制权限

下载

立即学习“Python免费学习笔记(深入)”;

  • **kwargs: Union[Unpack[TypeFilter1], Unpack[TypeFilter2]] 提供了静态类型检查支持(Pyright / mypy ≥ 1.5),提示 IDE 识别合法关键字参数;
  • ALLOWED_FIELDS 作为类属性而非类型参数,规避了 TypeVar + Unpack[T] 在运行时不可用的限制;
  • _filter_kwargs 方法解耦了“字段校验”与“实例构建”,便于子类定制(如添加类型转换或默认值填充);
  • 扩展至 N 个 TypedDict 仅需新增子类并设置 ALLOWED_FIELDS = YourFilter.__annotations__,零侵入修改基类。

⚠️ 注意事项:

  • TypedDict.__annotations__ 在运行时是 dict,但其键名与类型定义严格一致,适合做字段存在性校验;
  • 若需更强健的类型验证(如检查值是否符合字段类型),建议结合 pydantic.BaseModel 或自定义验证器;
  • 当前方案不阻止传入非法键(仅静默过滤),若需报错,可将 del 替换为 raise TypeError(f"Unexpected keyword argument: {k}")。

该模式平衡了类型提示能力、运行时灵活性与工程可维护性,是处理多态 **kwargs 初始化场景的推荐实践。

热门AI工具

更多
UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

375

2025.11.27

java多态详细介绍
java多态详细介绍

本专题整合了java多态相关内容,阅读专题下面的文章了解更多详细内容。

375

2025.11.27

c语言union的用法
c语言union的用法

c语言union的用法是一种特殊的数据类型,它允许在相同的内存位置存储不同的数据类型,union的使用可以帮助我们节省内存空间,并且可以方便地在不同的数据类型之间进行转换。使用union时需要注意对应的成员是有效的,并且只能同时访问一个成员。本专题为大家提供union相关的文章、下载、课程内容,供大家免费下载体验。

809

2023.09.27

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

391

2026.03.13

C++类型转换方式
C++类型转换方式

本专题整合了C++类型转换相关内容,想了解更多相关内容,请阅读专题下面的文章。

2542

2025.07.15

Docker Desktop怎么设置端口映射
Docker Desktop怎么设置端口映射

本专题聚焦Docker Desktop容器端口映射与访问配置,整理从创建容器、设置端口绑定到验证本地服务访问的操作流程。针对端口被占用、映射配置错误、容器服务无法访问等情况,也提供相应的检查方向,方便用户完成端口配置。

0

2026.11.03

Docker Desktop镜像构建教程
Docker Desktop镜像构建教程

想使用Docker Desktop将本地项目构建成Docker镜像?本专题围绕镜像构建的实际操作展开,介绍Dockerfile编写、构建命令使用、镜像标签设置和构建日志查看等内容,同时整理镜像无法生成、依赖安装失败及构建缓存异常等问题的排查思路。

0

2026.11.03

Docker Desktop容器创建指南
Docker Desktop容器创建指南

本专题聚焦Docker Desktop容器创建与运行配置,介绍通过本地镜像或远程镜像创建容器的方法,以及容器启动、终端访问、日志查看和基础管理等操作。针对端口冲突、参数配置不当、容器无法启动等情况,也整理了相应的排查方向。

0

2026.11.03

Tailwind CSS 如何制作导航栏和卡片
Tailwind CSS 如何制作导航栏和卡片

用 Tailwind CSS 制作导航栏和卡片,可先搭建语义化结构,再组合 Flex、Grid、间距、圆角与阴影类。这里整理横向导航、移动端菜单、卡片网格及悬停效果的相关文章,帮助你把常见页面组件做得清晰且适配不同屏幕。

0

2026.11.03

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn