Правильные подсказки типов Python для функций, которые возвращают список объектов неизвестных классов.Python

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

Сообщение Anonymous »

Предположим, я пишу каталог музейных предметов. Допустим, у меня есть такая иерархия данных (все приведенные ниже примеры представляют собой псевдокод и не взяты из какого-либо реального проекта):
файл baseclasses.py

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

class Book:
# Book stuff

class Drawing:
# Drawing stuff
файл age_medieval.py

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

from baseclasses import Book, Drawing

class MedievalBook(Book):
# Extends Book class and contains stuff specific to Medieval books

class MedievalDrawing(Drawing):
# Extends Drawing class and contains stuff specific to Medieval drawings
файл age_renaissance.py

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

from baseclasses import Book, Drawing

class RenaissanceBook(Book):
# Extends Book class and contains stuff specific to Renaissance books

class RenaissanceDrawing(Drawing):
# Extends Drawing class and contains stuff specific to Renaissance drawings
Теперь допустим, у меня есть функция (в совершенно другом файле), которая возвращает список предметов, выставленных в конкретном музее. Наверное, я мог бы сделать намек вот так:
файлвыставочный.py

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

from age_medieval import MedievalBook, MedievalDrawing
from age_renaissance import RenaissanceBook, RenaissanceDrawing

def items_exhibited(param1: int, param2: int, param3: int) -> list[MedievalBook | MedievalDrawing |  RenaissanceBook | RenaissanceDrawing]:
items = []
if param1 == EXHIBITION_MEDIEVAL:
items = filter_medieval_items(param2)
elif param1 == EXHIBITION_RENAISSANCE:
items = filter_renaissance_items(param3)
return items
Но мне это не нравится. Это много импорта только ради подсказки типа (данный конкретный файл не нуждается в этом импорте по какой-либо другой причине), а также я знаю, что большая часть импорта даже не будет «использована», поскольку в этом примере каждая выставка ограничена только одной эпохой (это либо list[MedievalBook | MedievalDrawing], либо list[RenaissanceBook | RenaissanceDrawing], но мы не знаем, какой именно, пока не начнем во время выполнения). Кроме того, мне это не нравится в долгосрочной перспективе - когда однажды в систему будут добавлены другие эпохи, мне придется обновить все такие совпадения типов, чтобы добавить такие вещи, как "| ModernBook | ModernDrawing", что... тьфу.
Есть ли лучший способ (мы можем предположить, что Python-3.12+, если это поможет)? Или мне просто оставить это как "-> list[]:"?

Подробнее здесь: https://stackoverflow.com/questions/798 ... -of-unknow

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