Я не могу понять, как правильно определить возвращаемые типы для функции.
Подробности:
Это функция, которая анализирует объект настроек и возвращает список значений параметров, это может быть tuple[str], tuple[str, str], tuple[Type[BaseCountryRatingComponent], bool] что угодно из набора [str, bool, Type[BaseCountryRatingComponent]].
Вопрос:
Как правильно определить типы возврата для settings_traversal?
from typing import Union, Type
class BaseCountryRatingComponent:
pass
class ComponentSetting:
pass
class CompositeComponentSetting:
pass
def settings_traversal(
settings: list[Union["ComponentSetting", "CompositeComponentSetting"]],
query_params: list[str],
) -> list[Union[str, bool, Type["BaseCountryRatingComponent"]]]:
pass
def get_model_and_orm_key(
self,
) -> list[tuple[Type["BaseCountryRatingComponent"], str]]:
return settings_traversal(settings, ["model", "orm_key"])
@BarakFatal Я привел пример вспомогательной функции, также ошибка находится в строке с возвратом.
Union[list[tuple[Any, ...]], list[Any]]
не имеет смысла - ничем не отличается от простого list[Any]
(T1 | T
упрощается до T
, если T1
является подтипом T
).
@SUTerliakov Конечно, но это не решает проблему
Создание минимального воспроизводимого примера может помочь 1) вам понять суть проблемы и 2) другим понять, в чем заключается реальная проблема. В вашем коде прямо сейчас много нерелевантных деталей, и в то же время отсутствуют части, которые позволили бы другим воспроизвести ошибку.
@DaniilFajnberg Спасибо за помощь, я старался.
Один из возможных способов — вручную написать все, что нам нужно
@classmethod
def settings_traversal(
cls,
settings: list[Union[ComponentSetting, CompositeComponentSetting]],
query_params: list[str],
) -> list[
Union[
str,
tuple[Type[BaseCountryRatingComponent], str],
tuple[str, str],
tuple[str, str, bool],
tuple[Union[str, bool, Type[BaseCountryRatingComponent]], ...],
]
]:
Или упрощает возвращаемые типы до
@classmethod
def settings_traversal(
cls,
settings: list[Union[ComponentSetting, CompositeComponentSetting]],
query_params: list[str],
) -> list[Any]
Согласен здесь. @Olexiy Kutsenko Я также думаю, что в целом, если ваша функция имеет так много типов возвращаемых значений, возможно, правильный способ справиться с этим - разделить ее на несколько функций.
@BarakFatal Конечно, но settings_traversal просматривает дерево настроек (каждый узел является классом данных) и извлекает атрибуты, указанные в query_params. Так что в моем случае нет способов отделить эту функцию.
Трудно дать вам ответ, не видя полный код вспомогательных функций и в каких строках mypy сообщал об ошибках. Не могли бы вы также поделиться им?