Типизация Python: перегрузка в зависимости от длины аргумента кортежаPython

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

Сообщение Anonymous »

Я хотел бы добавить аннотации перегруженного типа в существующий API, который имеет примерно такую ​​семантику:

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

def f(x: Tuple[int, ...]) -> Union[int, List[int]]:
if len(x) == 1:
return x[0]
return list(x)
Аргументом является кортеж, а тип возвращаемого значения — int или List[int] в зависимости от того, имеет ли кортеж длину 1.
Чтобы закодировать зависимость типа вывода от типа ввода, я попробовал следующее:

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

from typing import overload, List, Tuple

@overload
def f(x: Tuple[int]) -> int: ...

@overload
def f(x: Tuple[int, ...]) -> List[int]: ...

def f(x: Tuple[int, ...]) -> Union[int, List[int]]:
if len(x) == 1:
return x[0]
return list(x)
Но при проверке типа с помощью mypy выдается следующая ошибка:

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

script.py:4: error: Overloaded function signatures 1 and 2 overlap with incompatible return types
Found 1 error in 1 file (checked 1 source file)
Чтобы решить эту проблему, мне нужно, чтобы вторая перегрузка имела тип, указывающий «кортежи любой длины, кроме 1», но, похоже, такого эксклюзивного типа не существует (PEP 484: исключительный тип для подсказки типа). Как лучше всего определить перегруженные аннотации для этой функции?>

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