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

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

冬浩君_9871

冬浩君_9871

发布时间:2026-02-15 17:46:13

|

151人浏览过

|

来源于php中文网

原创

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

本文介绍如何通过基类抽象与运行时注解检查,实现多个 TypedDict 类型的构造函数逻辑复用,解决 **kwargs 动态类型校验与安全过滤问题,支持任意数量的 TypedDict 子类扩展。

本文介绍如何通过基类抽象与运行时注解检查,实现多个 typeddict 类型的构造函数逻辑复用,解决 `**kwargs` 动态类型校验与安全过滤问题,支持任意数量的 typeddict 子类扩展。

在 Python 类型驱动开发中,TypedDict 是表达结构化字典契约的有力工具;但其类型信息仅存在于静态检查阶段(如 mypy),无法直接参与运行时逻辑。当多个类需基于不同 TypedDict 定义接收并过滤 **kwargs 时,若重复编写相似的初始化逻辑,将违背 DRY 原则。理想的方案是:一份核心构造逻辑 + 多个类型专属的字段白名单,并通过继承自然组合。

以下是一个可扩展、类型友好且运行时安全的实现:

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

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

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

# 可选:支持 N 个 TypedDict 的通用基类
class BaseClass:
    # 使用 ClassVar 显式声明,便于类型检查器识别为类变量
    _allowed_keys: ClassVar[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_keys 白名单,过滤传入的 kwargs"""
        return {k: v for k, v in kwargs.items() if k in self._allowed_keys}

class MyClass1(BaseClass):
    _allowed_keys = TypeFilter1.__annotations__

class MyClass2(BaseClass):
    _allowed_keys = TypeFilter2.__annotations__

✅ 使用示例:

a = MyClass1(c="hello", d=2.0)      # params → "c:hello d:2.0"
b = MyClass2(e=2.1, f=42, g=99)    # 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]] 是一种类型联合提示,向类型检查器(如 mypy)表明:合法的关键字参数应属于任一 TypedDict 的键集。它不强制运行时校验,但极大提升 IDE 补全与静态分析能力。
  • _allowed_keys 作为 ClassVar 类变量,在子类中被静态覆盖(如 TypeFilter1.__annotations__),避免实例属性污染,也利于类型推导。
  • _filter_kwargs() 将类型契约(__annotations__)转化为运行时白名单,实现“声明即约束”,简洁且无反射开销。
  • 若未来新增 TypeFilter3,只需定义新 TypedDict 并创建对应子类(如 MyClass3(BaseClass): _allowed_keys = TypeFilter3.__annotations__),无需修改基类。

⚠️ 注意事项:

  • TypedDict.__annotations__ 返回的是 dict[str, type],其键即为允许的字段名,不包含 total=False 下的可选键的运行时存在性判断——本方案默认按“白名单严格过滤”,符合多数配置类场景;如需支持部分可选字段的语义,建议额外引入 TypedDict 实例验证逻辑(例如用 typing.cast + isinstance 配合 dict 构造)。
  • 当前 Union[Unpack[A], Unpack[B]] 在较新版本 Python(≥3.12)及 mypy(≥1.10)中支持良好;若使用旧版,可降级为 **kwargs: Any 并辅以 @overload 声明多个 __init__ 签名(牺牲简洁性换取兼容性)。
  • 此模式不依赖 Generic 或 TypeVar 绑定构造器签名——因为 **kwargs 的类型参数化在 Python 中尚无法在继承链中动态绑定,而运行时白名单机制更稳定、更易调试。

总结而言,该方案以类型声明为源、运行时白名单为桥、继承为组织方式,兼顾了静态类型安全性、运行时健壮性与工程可维护性,是处理多 TypedDict 构造场景的推荐实践。

热门AI工具

更多
创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

讯飞智文

一款面向学习和办公场景的AI文档创作工具,可辅助生成PPT与Word文档,提高资料整理和内容制作效率。

豆包大模型

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

墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

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

DeepSeek

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

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

WorkBuddy

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

相关专题

更多
c语言union的用法
c语言union的用法

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

809

2023.09.27

Postman身份认证怎么配置
Postman身份认证怎么配置

本专题从实际API接口调试场景出发,讲解Postman身份认证的完整配置流程,包括常见认证协议介绍、授权参数设置、访问令牌填写、OAuth 2.0授权及认证失败排查,帮助用户正确完成接口授权与访问验证。

0

2026.11.06

Postman请求头Headers怎么设置
Postman请求头Headers怎么设置

围绕Postman HTTP请求头配置展开,讲解Headers选项的具体使用方式,包括Key和Value参数填写、请求头信息添加、常见Header字段设置及请求头修改方法,帮助用户解决接口调试过程中遇到的请求头配置问题。

0

2026.11.06

Postman接口请求发送教程
Postman接口请求发送教程

详细介绍Postman接口请求的创建与发送方法,涵盖GET和POST请求、URL配置、请求参数、Headers请求头、Body请求体设置以及响应结果查看,帮助用户掌握Postman接口请求的完整操作流程。

0

2026.11.06

DBeaver怎么导入数据
DBeaver怎么导入数据

DBeaver数据导入专题,整理Excel、CSV、SQL、TXT等常见文件的数据导入方法,涵盖目标数据库选择、数据表创建、字段映射、数据类型设置及导入参数配置等操作,帮助用户将本地文件中的数据写入数据库,并了解批量导入、重复数据处理和导入失败等常见问题的解决方法。

20

2026.11.05

DBeaver安全防护教程大全
DBeaver安全防护教程大全

DBeaver安全防护专题,围绕数据库连接安全、账号密码保护和访问权限管理展开,整理SSL/TLS加密连接、SSH隧道、数据库凭据保存及证书验证等配置方法,同时介绍敏感信息保护、远程连接风险和高权限账号使用等注意事项,帮助用户提高数据库日常管理的安全性。

20

2026.11.05

DBeaver连接创建与配置教程
DBeaver连接创建与配置教程

本专题聚焦DBeaver数据库连接配置与管理,覆盖从新建连接、选择数据库类型到填写连接参数和验证连接的完整流程。针对MySQL、PostgreSQL、SQL Server等常见数据库,整理相应的连接设置方法,并提供驱动缺失、认证失败和连接异常等问题的排查方向。

20

2026.11.04

XORM框架结构体映射与表结构同步
XORM框架结构体映射与表结构同步

本专题围绕XORM框架的结构体映射展开,说明表名与字段的命名策略、xorm标签常用属性、主键自增与时间字段自动填充,并演示Sync2自动建表、增量字段升级、索引声明与反向生成结构体的完整流程。

20

2026.11.04

XORM框架安装配置与数据库连接
XORM框架安装配置与数据库连接

本专题聚焦XORM框架的配置与连接环节,拆解MySQL、PostgreSQL、SQLite、SQL Server的DSN写法与驱动选择,讲清连接池参数、多数据源拆分、读写分离与超时重连的处理方式,并补充容器与兼容数据库的适配经验。

20

2026.11.04

热门下载

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

精品课程

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

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