Как эффективно использовать дженерики в Python для указания типа функции с двумя аргументами одного типа (int или str)?Python

Программы на Python
Ответить
Anonymous
 Как эффективно использовать дженерики в Python для указания типа функции с двумя аргументами одного типа (int или str)?

Сообщение Anonymous »

У меня есть функция, которая принимает два аргумента одного типа: int или str. Моя первоначальная реализация без дженериков выглядит так:
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
Эта реализация неэффективна, поскольку она проверяет тип b, хотя мы знаем, что он должен иметь тот же тип, что и a. Это также допускает возможность того, что 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
Однако mypy сообщает о следующих ошибках:

текстовая ошибка: несовместимый тип возвращаемого значения (получено «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
ошибка: отсутствует оператор возврата [return] ошибка: несовместимый тип возвращаемого значения
(получено «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]
Но я действительно не могу понять, почему говорится, что функция возвращает int или str вместо T.

Подробнее здесь: https://stackoverflow.com/questions/791 ... -two-argum
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»