解决Python类型提示问题:让函数返回对应输入类型的实例
问题:如何让工厂函数返回对应输入类的正确类型实例?
在Python 3.10中,以下代码可以正常运行,但静态代码分析工具Pylance会抛出generalTypeIssue错误,提示“无法访问Animal类型的成员bark”:
@dataclass class Animal(): name:str class Dog(Animal): def bark(self): print("whoof") class Snake(Animal): def bite(self): print("bite!!!") def make_animal(animal_class: type[Animal], name: str) -> Animal: return animal_class(name=name) my_dog = make_animal(animal_class=Dog, name="bello") # type(my_dog) 实际是 <class '__main__.Dog'> my_dog.bark() <--- Pylance报错位置
解决方案:使用泛型标注类型
通过typing模块的TypeVar和Type定义泛型类型,让静态分析工具能准确推断返回实例的具体类型:
from dataclasses import dataclass from typing import TypeVar, Type # 定义绑定到Animal的类型变量T,T只能是Animal或其子类 T = TypeVar('T', bound='Animal') @dataclass class Animal: name: str class Dog(Animal): def bark(self): print("whoof") class Snake(Animal): def bite(self): print("bite!!!") # 函数参数标注为Type[T],返回类型标注为T def make_animal(animal_class: Type[T], name: str) -> T: return animal_class(name=name) my_dog = make_animal(Dog, "bello") my_dog.bark() # Pylance不再报错,可正确识别my_dog为Dog类型 my_snake = make_animal(Snake, "sly") my_snake.bite() # 同样能正确推断为Snake类型
说明
TypeVar('T', bound='Animal')限制了T的范围,确保传入的类必须是Animal的子类,避免类型不安全的输入。- 将函数的参数类型设为
Type[T],表示传入的是T对应的类对象;返回类型设为T,让静态分析工具明确返回的实例类型与传入的类一致,而非基类Animal。
内容的提问来源于stack exchange,提问作者user14534957
相关产品推荐
相关产品推荐

