如何为含空字符串根键的字典创建TypedDict类型?
如何为带空字符串根键的JSON创建TypedDict类?
问题场景
你有一段根键为空字符串""的JSON结构,想要用Python的TypedDict做类型标注,但不知道如何处理这个特殊的空键:
{ "": { "0": { "1874900": { "0": "Fri, 27 May 2022 14:06:00 GMT", "0x": "1660211676", "change": "15628780", "v": "3" }, "8680": { "change": "11703200", "v": "3" } }, "1":{ "594602": { "change": "13682071", "v": "3" }, "2093200": { "3": "Fri, 29 Jul 2022 12:11:31 GMT", "3x": "1660219952", "change": "15629992", "v": "3" } } } }
解决方案
Python的TypedDict支持直接使用字符串字面量作为键名,包括空字符串。你可以从最内层的结构开始,逐层向外定义嵌套的TypedDict类:
from typing import TypedDict, Union # 基础条目类型:仅包含change和v字段 class BasicEntry(TypedDict): change: str v: str # 扩展条目类型:继承基础字段,补充时间相关字段 class ExtendedEntry(BasicEntry): 0: str 0x: str 2: str 2x: str 1: str 1x: str 3: str 3x: str icon: str 4x: str 5: str 5x: str # 第一层子字典:键为数字字符串,值为基础或扩展条目 class Level1Dict(TypedDict, total=False): # 显式列出已知键,total=False允许存在未定义的额外键 1874900: ExtendedEntry 8680: BasicEntry 851470: BasicEntry 594602: BasicEntry 594596: BasicEntry 594600: BasicEntry 594601: BasicEntry 594595: BasicEntry 2093200: ExtendedEntry # 第二层子字典:键为"0"和"1" class Level0Dict(TypedDict): 0: Level1Dict 1: Level1Dict # 根TypedDict:直接用空字符串作为键名 class RootDict(TypedDict): "": Level0Dict
说明
- 空字符串键直接在
TypedDict中写成""即可,Python类型检查器(如mypy)完全支持这种写法。 - 若JSON存在动态未知键,添加
total=False参数可兼容未显式定义的键,也可以用Mapping[str, Union[BasicEntry, ExtendedEntry]]替代Level1Dict来适配任意字符串键。 - 从内到外的嵌套定义能让类型结构更清晰,便于后续维护和类型检查。
内容的提问来源于stack exchange,提问作者rkr87
相关产品推荐
相关产品推荐

