嵌套字典类型提示问题:如何用TypedDict解决类型不兼容报错
用TypedDict解决嵌套字典的类型提示问题
问题根源在于你给spreadsheet_list标注的类型dict[str, dict[str, Union[str, list[str]]]]过于宽泛——类型检查器无法确定info['gsheet_key']必然是字符串,也无法确定info['primary_key']必然是字符串列表,因此抛出类型不兼容的错误。
使用TypedDict可以精准定义嵌套字典的结构,让类型检查器明确每个字段的类型,具体步骤如下:
- 导入TypedDict:Python 3.8及以上可直接从
typing导入,3.8以下需从typing_extensions导入 - 定义子字典的TypedDict类型:明确指定每个键对应的类型
- 更新主字典的类型标注:用定义好的TypedDict替代宽泛的
dict[str, Union[...]]
完整代码示例
# Python 3.8+ 从typing导入,3.8以下需从typing_extensions导入 from typing import TypedDict # 定义子字典的结构,明确每个字段的类型 class SpreadsheetInfo(TypedDict): gsheet_key: str primary_key: list[str] # 用TypedDict标注主字典的类型 spreadsheet_list: dict[str, SpreadsheetInfo] = { 'final_kpis': { 'gsheet_key': '1np6fM9d_BrBuDbBKWkWwUjhNypoCtto_84bLcx-HBdk', 'primary_key': ['KPI_Reference'] }, 'maplecroft_risk_drivers': { 'gsheet_key': '1rV2oXbvvXcq6glLpHu1X4e_huR4mkZ4bbcZ2cQPv_A0', 'primary_key': ['Commodity_type', 'Commodity', 'Country'] } } def do_stuff(name: str, gsheet_key: str, primary_key: list[str]): # 函数实现逻辑 pass # 遍历调用,此时类型检查器能正确识别参数类型 for name, info in spreadsheet_list.items(): do_stuff(name, info['gsheet_key'], info['primary_key'])
修改后,类型检查工具会准确推断info['gsheet_key']为str、info['primary_key']为list[str],与do_stuff的参数类型完全匹配,不会再抛出类型错误。
内容的提问来源于stack exchange,提问作者Oliver Angelil
相关产品推荐
相关产品推荐

