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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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