Как эффективно использовать дженерики в 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.

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

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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