如何解决向字典内嵌套列表追加元素时mypy报‘object无append属性’错误
解决mypy报错"object has no attribute append"的问题
问题原因
mypy无法自动识别my_dict['key'][1]是列表类型——因为my_dict['key']是包含字符串和列表的混合类型列表,mypy会将其推断为List[object],索引访问后得到的是object类型,自然没有append方法。
解决方法
1. 添加精确的类型注解
通过类型注解明确嵌套结构的类型,让mypy能正确推断:
from typing import List, Dict, Union, TypedDict # 定义内层字典的类型 class InnerItem(TypedDict): id: str number: str # 明确外层字典的类型 my_dict: Dict[str, List[Union[str, List[InnerItem]]]] = { 'key': ['string', [{'id': 'id_value', 'number': 'number_value'}]] } # 此时append操作不会触发mypy报错 my_dict['key'][1].append({'id2': 'id_value2', 'number2': 'number_value2'})
2. 使用类型断言
如果不想写复杂注解,用断言告诉mypy目标元素是列表:
my_dict = {'key': ['string', [{'id': 'id_value', 'number': 'number_value'}]]} # 断言并检查类型 assert isinstance(my_dict['key'][1], list) my_dict['key'][1].append({'id2': 'id_value2', 'number2': 'number_value2'})
断言不仅能让mypy认可类型,还能在运行时做校验,避免实际类型不符导致的错误。
3. 重构数据结构(推荐)
混合类型的列表可读性差且易引发类型问题,建议改为更清晰的结构:
# 重构后用字典拆分混合元素 my_dict = { 'key': { 'text': 'string', 'items': [{'id': 'id_value', 'number': 'number_value'}] } } # 追加元素逻辑清晰,mypy自动识别类型 my_dict['key']['items'].append({'id2': 'id_value2', 'number2': 'number_value2'})
内容的提问来源于stack exchange,提问作者J. Donič
相关产品推荐
相关产品推荐

