Python типизация: Как ввести переменную в типизированном слове, у которой есть значение по умолчанию в c веселье, которое она используется? - PullRequest
0 голосов
/ 28 мая 2020

Я обнаружил, что когда-то набираю python go и сейчас пытаюсь использовать его в своих проектах.

Я столкнулся с проблемой:

У меня два класса. Один из них - оценщик результатов обучения машинному обучению. Второй - компаратор, который создает n оценщиков и сравнивает их результаты.

    class Parameters(TypedDict):
        modelname: str
        filename: str
        last_ckpt: str
        project_path: str
        number_of_ckpt: int

    class ResultEvaluator(object):
        def __init__(
               self,
               parameters: Parameters,
               evaluation_results_folder: str = <default path>,
               kitti_native_results_path: str = <default  path>
       ) -> None:
           self.parameters = parameters
           self.evaluation_results_folder = evaluation_results_folder
           self.kitti_native_results_path = kitti_native_results_path


    class ComparatorFormatParameters(TypedDict):
        parameters: Parameters
        evaluation_results_folder: str
        kitti_native_results_path: str



    class ResultComparator(object):
       def __init__(
               self,
               comperator_objectives_params:
               List[ComparatorFormatParameters]
       ) -> None:
           self.comparator_objectives: List[re.ResultEvaluator] = \
               [
                   re.ResultEvaluator(**objective_params)
                   for objective_params in comperator_objectives_params
               ]     

Оценщик получает словарь и две строки во время инициализации. Словарь содержит все параметры, которые необходимо указывать всегда. Две строки содержат пути, которые никогда не нужно изменять во время нормальной работы. Однако их необходимо изменить в тестовых целях. Поэтому в методе init им присваивается значение по умолчанию. Таким образом, вы также можете просто инициализировать оценщик со словарем.

Чтобы я мог использовать компаратор с n оценщиками, я даю ему список с параметрами оценщика. Чтобы их можно было легко распаковать для инициализации оценщика, я также создал типизированный dict. Он содержит параметр оценщика, набранный dict, и две строки. Все это пока работает.

Только если я помечу две строки набранного dict как необязательные, во время проверки типа будет ошибка mypy, потому что метод оценки init должен получить ее параметр dict и две строки. Но поскольку доступны значения по умолчанию, проблем с его использованием не возникает.

Нужно ли мне вводить две строки в типизированном dict как строковые типы, даже если они не всегда включены? В приведенном выше примере кода я сделал это, и у меня нет ошибок mypy, но почему-то мне это кажется не совсем правильным. Или есть совсем другое и более приятное решение? Спасибо за помощь!

edit:

На данный момент я могу инициализировать оценщик результатов следующим образом:

    result_evaluator_instance = ResultEvaluator(
            {
                "model name": <model name>,
                "filename": <filename>,
                "last_ckpt": "120000"
                "project_path": <path>,
                "number_of_ckpt": 12
            },
            <path>,
            <path>
   )

или:

    result_evaluator_instance = ResultEvaluator(
            {
                "model name": <model name>,
                "filename": <filename>,
                "last_ckpt": "120000"
                "project_path": <path>,
                "number_of_ckpt": 12
            }
    )

Обычно используется второй вариант.

Когда я инициализирую компаратор, происходит следующее:

    comparator = ResultComparator(
                [
                    {
                        "parameters": {
                                         "model name": <model name>,
                                         "filename": <filename>,
                                         "last_ckpt": "120000"
                                         "project_path": <path>,
                                         "number_of_ckpt": 12
                                      }
                    },
                    {
                        "parameters": {
                                         "model name": <model name>,
                                         "filename": <filename>,
                                         "last_ckpt": "120000"
                                         "project_path": <path>,
                                         "number_of_ckpt": 12
                                      }
                    },
                ]
            )

или:

    comparator = ResultComparator(
                [
                    {
                        "parameters": {
                                         "model name": <model name>,
                                         "filename": <filename>,
                                         "last_ckpt": "120000"
                                         "project_path": <path>,
                                         "number_of_ckpt": 12
                                      },
                        "evaluation_results_folder": <path>,
                        "kitti_native_results_path": <path>
                    },
                    {
                        "parameters": {
                                         "model name": <model name>,
                                         "filename": <filename>,
                                         "last_ckpt": "120000"
                                         "project_path": <path>,
                                         "number_of_ckpt": 12
                                      },
                        "evaluation_results_folder": <path>,
                        "kitti_native_results_path": <path>
                    }
                ]
        )

Он также работает в обоих кейс. Я просто думаю, что это заблуждение, если в ComparatorFormatParameter оба пути имеют строку типа, хотя они не всегда должны присутствовать. Итак, я искал синтаксически правильный способ обозначить это.

Я также попытался присвоить значения по умолчанию двум строкам в ComparatorFormatParameters.

    class ComparatorFormatParameters(TypedDict):
        parameters: Parameters
        evaluation_results_folder: str = None
        kitti_native_results_path: str = None

К сожалению, эти значения по умолчанию затем перезаписывают значения по умолчанию, которые я назначил в ResultEvaluator. init .

До сих пор я опционально пробовал то, что я считаю Union [str, None]. Но теперь я снова явно протестировал Union [str, None], и ​​mypy возвращает ошибки.

...