Python中如何为可迭代对象内的元素做正确类型标注
不定长自定义对象列表的正确类型标注方法
你之前写的List[MyModel, ...]无法生效,核心是混淆了列表和元组的类型标注规则:
- 省略号
...的泛型语法是专门给tuple/Tuple设计的:元组的泛型参数默认按位置一一对应固定长度下每个位置的元素类型,只有要表示任意长度、元素类型统一的元组时,才需要写成Tuple[元素类型, ...] - 列表的泛型参数仅需要传入元素类型这一个值,默认就代表任意长度、所有元素均为指定类型的列表,不需要额外加省略号。
具体写法
根据你使用的Python版本选择对应写法即可:
Python 3.9+ 版本
3.9版本开始支持内置泛型类型,不需要导入typing模块的特殊类型,直接标注:
class MyModel: pass def my_func(var: list[MyModel]): pass
这个标注的含义就是:参数var是一个长度无限制、所有元素均为MyModel类型实例的列表,完全匹配你的需求。
Python 3.8 及更早版本
需要先从typing模块导入List类型再做标注:
from typing import List class MyModel: pass def my_func(var: List[MyModel]): pass
补充说明
你最开始使用的裸写List(不传泛型参数)等价于List[Any],相当于放弃了对列表内元素的类型校验,类型检查工具不会提示列表内元素类型不匹配的问题,不推荐使用。
内容的提问来源于stack exchange,提问作者André Ginklings
相关产品推荐
相关产品推荐

