Сложная типизация в Python

Я не могу понять, как правильно определить возвращаемые типы для функции.

Подробности:

Это функция, которая анализирует объект настроек и возвращает список значений параметров, это может быть 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"])

Трудно дать вам ответ, не видя полный код вспомогательных функций и в каких строках mypy сообщал об ошибках. Не могли бы вы также поделиться им?

Barak Fatal 19.02.2023 13:40

@BarakFatal Я привел пример вспомогательной функции, также ошибка находится в строке с возвратом.

Olexiy Kutsenko 19.02.2023 14:03
Union[list[tuple[Any, ...]], list[Any]] не имеет смысла - ничем не отличается от простого list[Any] (T1 | T упрощается до T, если T1 является подтипом T).
SUTerliakov 19.02.2023 17:35

@SUTerliakov Конечно, но это не решает проблему

Olexiy Kutsenko 19.02.2023 17:43

Создание минимального воспроизводимого примера может помочь 1) вам понять суть проблемы и 2) другим понять, в чем заключается реальная проблема. В вашем коде прямо сейчас много нерелевантных деталей, и в то же время отсутствуют части, которые позволили бы другим воспроизвести ошибку.

Daniil Fajnberg 19.02.2023 19:08

@DaniilFajnberg Спасибо за помощь, я старался.

Olexiy Kutsenko 19.02.2023 20:59
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Инструменты для веб-скрапинга с открытым исходным кодом: Python Developer Toolkit
Веб-скрейпинг, как мы все знаем, это дисциплина, которая развивается с течением времени. Появляются все более сложные средства борьбы с ботами, а...
Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Эмиссия счетов-фактур с помощью Telegram - Python RPA (BotCity)
Привет, люди RPA, это снова я и я несу подарки! В очередном моем приключении о том, как создавать ботов для облегчения рутины. Вот, думаю, стоит...
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
Учебник по веб-скрапингу
Учебник по веб-скрапингу
Привет, ребята... В этот раз мы поговорим о веб-скрейпинге. Целью этого обсуждения будет узнать и понять, что такое веб-скрейпинг, а также узнать, как...
Тонкая настройка GPT-3 с помощью Anaconda
Тонкая настройка GPT-3 с помощью Anaconda
Зарегистрируйте аккаунт Open ai, а затем получите ключ API ниже.
0
6
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Один из возможных способов — вручную написать все, что нам нужно

@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 Я также думаю, что в целом, если ваша функция имеет так много типов возвращаемых значений, возможно, правильный способ справиться с этим - разделить ее на несколько функций.

Barak Fatal 20.02.2023 15:16

@BarakFatal Конечно, но settings_traversal просматривает дерево настроек (каждый узел является классом данных) и извлекает атрибуты, указанные в query_params. Так что в моем случае нет способов отделить эту функцию.

Olexiy Kutsenko 21.02.2023 12:34

Другие вопросы по теме