Python Typing:如何让类方法返回列表类型与输入列表元素类型匹配
解决方案:使用泛型绑定列表元素动态类型
你需要借助Python的泛型类型提示体系,为拆分类绑定列表元素的动态类型,具体实现如下:
首先导入所需的类型工具:
from typing import TypeVar, Generic, Callable
定义泛型变量,并重写相关类和函数的类型标注:
# 定义泛型变量T,代表列表中的元素类型,会随输入动态匹配 T = TypeVar('T') def func_A(cls_instance: T) -> list[T]: # 保留你的原有实现逻辑 ... # 实际返回对应类型的实例列表 return [] # 让拆分类继承泛型基类,绑定泛型T class DividerClass(Generic[T]): def __init__(self, list_of_classes: list[T], func: Callable[[T], bool]): self.list_of_classes = list_of_classes self.func = func # 显式标注结果列表的元素类型为T self.result_list_1: list[T] = [] self.result_list_2: list[T] = [] def divide(self) -> tuple[list[T], list[T]]: for item in self.list_of_classes: if self.func(item): self.result_list_1.append(item) else: self.result_list_2.append(item) return self.result_list_1, self.result_list_2
调用示例:
if __name__ == '__main__': # 示例业务类 class SomeClass: pass class YetAnotherClass: pass # 替换为你的实际判断逻辑 lambda_func = lambda x: True list_1: list[SomeClass] = func_A(SomeClass()) list_2: list[YetAnotherClass] = func_A(YetAnotherClass()) # IDE会自动推导返回值为 tuple[list[SomeClass], list[SomeClass]] result_1_a, result_1_b = DividerClass(list_1, lambda_func).divide() # IDE会自动推导返回值为 tuple[list[YetAnotherClass], list[YetAnotherClass]] result_2_a, result_2_b = DividerClass(list_2, lambda_func).divide()
泛型变量T会在你传入具体列表时自动匹配列表的元素类型,类中所有和列表元素相关的类型都会同步绑定为该类型,主流IDE和静态类型检查工具都能正确识别返回值的元素类型,不会再返回无元素类型的泛化list提示。
内容的提问来源于stack exchange,提问作者DummyThatMatters
相关产品推荐
相关产品推荐

