python
Код: Выделить всё
def combine1(a: int | str, b: int | str) -> int | str:
match a:
case int():
match b:
case int():
return a + b
case str():
return "error"
case str():
match b:
case int():
return "error"
case str():
return a + b
Чтобы улучшить это, я хочу использовать дженерики, чтобы mypy понимал, что a и b имеют один и тот же тип. Вот моя попытка:
python
Код: Выделить всё
def combine2[T: int | str](a: T, b: T) -> T:
match a:
case int():
return a + b
case str():
return a + b
текстовая ошибка: несовместимый тип возвращаемого значения (получено «int», ожидается "T")
Ошибка [возвращаемого значения]: неподдерживаемые типы операндов для + ("int" и "T")
Ошибка [оператора]: несовместимый тип возвращаемого значения (получено "str", ожидается)
"T") [возвращаемое значение] ошибка: неподдерживаемые типы операндов для + ("T" и
"T") [оператор]
Как я могу изменить эту функцию, чтобы правильно использовать дженерики и удовлетворять проверке типов mypy, гарантируя при этом, что функция принимает только два аргумента одного и того же типа (либо int, либо оба str), и избегая неэффективности первой реализации ?
Этот вопрос отличается от этого: Как использовать подсказку типа, чтобы гарантировать, что две переменные всегда имеют один и тот же тип?
потому что Я пытаюсь предложить решить эту проблему с помощью generic. Чего нет в этом вопросе.
Кроме того, этот вопрос не использует сопоставление с образцом внутри функции. Я хочу избежать двойной проверки типа переменных, потому что я уже знаю, что они имеют один и тот же тип. Я хотел бы просто проверить тип T.
Хорошим решением, которое не работает, было бы использование сопоставления с образцом для типа T вместо переменной
Я тоже это пробовал:
Код: Выделить всё
def combine3[T : int | str](a: T, b: T) -> T:
match a,b:
case int(),int():
return a +b
case str(), str():
return a+b
(получено «int», ожидается «T») [return- value] ошибка:
Несовместимый тип возвращаемого значения (получено «str», ожидается «T»)
[return-value]
mypy не может понять, что предложенные мной два случая являются единственно возможными один. Чтобы удалить первую ошибку, мне нужно добавить регистр по умолчанию
Код: Выделить всё
def combine4[T : int | str](a: T, b: T) -> T:
match a,b:
case int(),int():
return a +b
case str(), str():
return a+b
case _ :
return a
Код: Выделить всё
error: Incompatible return value type (got "int", expected "T") [return-value]
error: Incompatible return value type (got "str", expected "T") [return-value]
Подробнее здесь: https://stackoverflow.com/questions/791 ... -two-argum
Мобильная версия