Подсказки типов Python для продвижения типовPython

Программы на Python
Anonymous
Подсказки типов Python для продвижения типов

Сообщение Anonymous »

Рассмотрим функцию, которая выполняет повышение типа, например. простое умножение двух чисел, которые могут быть либо целыми, либо плавающими:

Код: Выделить всё

def mul(a: int | float, b: int | float):  # return type?
return a * b
Эта функция возвращает число с плавающей запятой, за исключением случая, когда и a, и b имеют значения int.
Как правильно и кратко аннотировать тип возвращаемого значения? Я знаю, что могу сделать это с помощью @overload:

Код: Выделить всё

from typing import overload

@overload
def mul(a: int, b: int) -> int: ...

@overload
def mul(a: float, b: int | float) -> float: ...

@overload
def mul(a: int | float, b: float) -> float: ...

def mul(a, b):
return a * b
но это очень многословно и требует множества перегрузок для того, что, как я полагаю, должна обрабатывать какая-то «функция типа». В C++ это можно сделать, например. с СФИНАЭ. Могу ли я сделать что-то подобное в Python с точки зрения общей функции типа

Код: Выделить всё

def mul(a: T1, b: T2) -> promote_types(T1, T2):
return a * b
это также работает с TypeVars? Я не ожидаю, что что-то встроенное уже работает для int и float, но, возможно, есть какой-то метод?
Примечания:
  • Я знаю о рекомендации просто аннотировать все, принимая int с плавающей точкой, но в моей настройке более сложные TypeVars, выбор int и float — это всего лишь простой пример.
  • Я знаю, что могу просто использовать Union[int, float]< /code>, но мне нужно, чтобы это было конкретно. В зависимости от конкретных типов, с которыми вызывается функция, тип возвращаемого значения также должен быть точным, а не объединением.


Подробнее здесь: https://stackoverflow.com/questions/775 ... -promotion

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