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

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

Сообщение Anonymous »

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

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

class Item:
# Item stuff

class Book(Item):
# Book stuff

class Drawing(Item):
# 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
Ответить

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

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

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

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

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