关于mypy与嵌套字典推导式的报错咨询
分析你的mypy报错原因及解决办法
嘿,虽然你没贴出具体的mypy报错内容,但根据你的代码结构,我几乎能肯定问题出在那个空列表上——就是type2里category3对应的[],咱们来一步步拆解:
核心问题:空列表导致的类型推断冲突
mypy对空列表的默认类型推断非常严格:它会把没有元素的空列表标记为List[Never](表示这个列表永远不会包含任何元素),但你字典里其他子类别列表都是明确的List[str](比如category1、category2的列表)。
当你的嵌套字典推导式遍历到category3的空列表时,mypy会认为subcategory的类型是Union[str, Never]——也就是可能是字符串,也可能是“永远不存在的元素”。但字典的键必须是有实际取值的类型,Never类型完全不符合要求,所以就触发了报错。
另外还有个小细节:你用了type作为循环变量名,这是Python的内置关键字,虽然语法上没问题,但mypy可能会给你一个风格警告,建议改成type_这类名字。
两种解决办法
方法1:给原字典标注明确的类型
直接告诉mypy整个字典的结构,让它知道所有子类别列表都是字符串类型,包括空列表:
from typing import Dict, List my_dict: Dict[str, Dict[str, List[str]]] = { 'type1': { 'category1': [ 'subcategory1', 'subcategory2', ], }, 'type2': { 'category2': [ 'subcategory3', ], 'category3': [], # 现在mypy会识别这是List[str]类型 }, }
方法2:在推导式中跳过空列表
如果不想修改原字典的类型定义,也可以在推导式里直接过滤掉空的subcategories,彻底避免mypy处理Never类型的情况:
new_dict = { subcategory: { 'category': category, 'type': type_, } for type_, categories in my_dict.items() for category, subcategories in categories.items() if subcategories # 跳过空列表,只处理有元素的情况 for subcategory in subcategories }
可选:给新字典加上更清晰的类型注解
如果想要更严谨的类型检查,还可以用TypedDict明确新字典的值结构:
from typing import Dict, TypedDict class SubcategoryMeta(TypedDict): category: str type: str new_dict: Dict[str, SubcategoryMeta] = { subcategory: { 'category': category, 'type': type_, } for type_, categories in my_dict.items() for category, subcategories in categories.items() if subcategories for subcategory in subcategories }
内容的提问来源于stack exchange,提问作者vhemt
相关产品推荐
相关产品推荐

