修改CSV列表元素类型时触发mypy call-overload错误求助
解决Mypy列表类型不匹配错误的方法
问题根源
从CSV读取的行默认被Mypy推断为list[str]类型(所有元素都是字符串),当你尝试将datetime或Decimal类型的值存入这个列表时,违反了列表元素类型的一致性,因此触发类型不匹配错误。
具体解决办法
方法1:显式标注列表为联合类型
告诉Mypy这个列表允许包含字符串、日期时间和Decimal类型:
from typing import List, Union from datetime import datetime from decimal import Decimal # 读取原始CSV行 csv_row = next(csv_reader) # 重新标注列表类型 csv_row: List[Union[str, datetime, Decimal]] = csv_row # 执行类型转换 csv_row[1] = parse_time_helper_function(csv_row[1]) csv_row[2] = Decimal(csv_row[2])
方法2:使用类型转换(cast)临时绕过检查
如果不想修改整个列表的类型标注,可以用cast让Mypy信任你对类型的判断(注意:需确保运行时类型正确,避免潜在bug):
from typing import cast from datetime import datetime from decimal import Decimal csv_row = next(csv_reader) csv_row[1] = cast(datetime, parse_time_helper_function(csv_row[1])) csv_row[2] = cast(Decimal, Decimal(csv_row[2]))
方法3:转换为结构化类型(推荐)
将CSV行转换为dataclass,让类型定义更清晰、更易维护:
from dataclasses import dataclass from datetime import datetime from decimal import Decimal @dataclass class CSVRecord: column0: str timestamp: datetime amount: Decimal # 根据实际列数添加其他字段及类型 # 读取并解析为结构化对象 raw_row = next(csv_reader) parsed_record = CSVRecord( column0=raw_row[0], timestamp=parse_time_helper_function(raw_row[1]), amount=Decimal(raw_row[2]) )
内容的提问来源于stack exchange,提问作者64rl0
相关产品推荐
相关产品推荐

