Я обнаружил, что когда-то набираю 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 возвращает ошибки.