Python3.8如何为相同A子类实例组成的同质列表添加类型提示?
解决方案
核心是使用带边界的泛型类型变量TypeVar实现需求,无需穷举A的所有子类,适配Python3.8 + PyCharm静态校验规则。
修改后的完整代码如下:
from typing import TypeVar, List class A: pass class A1(A): pass class A2(A): pass # 定义泛型T,上限为A,即T只能是A或A的子类 T = TypeVar('T', bound=A) def help_here(s: List[T]): if isinstance(s[0], A1): # PyCharm会自动完成类型收窄,识别此时s为List[A1],无警告 process_a1_list(s) def process_a1_list(lst: List[A1]): pass def another_test(): # 合法入参:无警告 good_list: List[A1] = [] help_here(good_list) # 非法入参1:List[A],如果需要触发警告可将A定义为抽象基类(禁止实例化A),此时不存在合法的List[A]实例,调用会触发警告 bad_list_1: List[A] = [] help_here(bad_list_1) # 非法入参2:元素不是A的子类,PyCharm直接触发类型不匹配警告 bad_list_2: List[int] = [] help_here(bad_list_2)
校验效果说明
- 合法入参:所有元素为同一A子类的列表,类型校验通过无警告
- 混合不同A子类的列表:PyCharm会推断T为公共父类A,若A为抽象基类则直接触发警告
- 元素非A子类的列表:直接触发类型不匹配警告
- 函数内部
isinstance判断后,PyCharm会自动收窄泛型T的实际类型,调用对应处理函数无类型不匹配警告
注意事项
如果需要严格禁止List[A]类型的入参,只需将A声明为抽象基类即可:
from abc import ABC class A(ABC): pass
抽象基类无法直接实例化,自然不存在合法的List[A]入参,所有合法入参必然是List[A的子类]类型。
内容的提问来源于stack exchange,提问作者Alexander C
相关产品推荐
相关产品推荐

