Mypy и дисперсия функции, возвращающей список подклассов на основе входного параметра ⇐ Python

Программы на Python
Anonymous
Mypy и дисперсия функции, возвращающей список подклассов на основе входного параметра

Сообщение Anonymous »

Я пытаюсь правильно аннотировать свой код. Вот пример фрагмента, позволяющего воссоздать мою проблему:

Код: Выделить всё

from pydantic import BaseModel
from typing import TypeVar

class Shape(BaseModel):
name: str

class Circle(Shape):
diameter: float

class Square(Shape):
side: float

class Triangle(Shape):
base: float
height: float

T = TypeVar("T")

def generate_shapes(shapes: list[type[T]]) -> list[T]:
generated_shapes = []
for shape in shapes:
if shape == Circle:
generated_shapes.append(Circle(name=shape.__name__, diameter=10))
elif shape == Square:
generated_shapes.append(Square(name=shape.__name__, side=10))
elif shape == Triangle:
generated_shapes.append(Triangle(name=shape.__name__, base=10, height=10))
return generated_shapes

if __name__ == "__main__":
result = generate_shapes([Circle, Triangle])

Практически код выглядит нормально, однако mypy жалуется. В частности, я пытаюсь понять следующую ошибку:

Аргумент 1 для "generate_shapes" имеет несовместимый тип
"list[ModelMetaclass]"; ожидается "list[type[Never]]"

Моей целью было бы иметь возможность определить тип выходного списка на основе входных данных. Похоже, что с помощью этой аннотации vscode способен это понять:
Изображение
Изображение
Я понимаю, что mypy жалуется, потому что списки изменяемы и не могут быть ковариантными. . Итак, я боюсь, что нет выхода для того, чего я пытаюсь достичь (вывод vscode + mypy счастлив)?

Подробнее здесь: https://stackoverflow.com/questions/790 ... input-para

Вернуться в «Python»