Аннотация типа для перегрузок, исключающих типы (что-то вместо всего остального)Python

Программы на Python
Ответить
Anonymous
 Аннотация типа для перегрузок, исключающих типы (что-то вместо всего остального)

Сообщение Anonymous »

Я пытаюсь использовать @overload для передачи различных способов вызова функции, но то, что легко передается в коде с помощью простого оператора else, невозможно в аннотациях типов. Без «else» MyPy (правильно) жалуется, что версии перегрузки не совпадают (см., например, фрагмент ниже).

error: Overloaded function signatures 1 and 2 overlap with incompatible return types

Правильно ли я понял, что хорошего решения этой проблемы не существует?

например. вот простой пример:

ListOrTuple = TypeVar("ListOrTuple", List, Tuple)
# unfortunately, typing doesn't support "anything else" at the moment
# https://github.com/python/typing/issues ... -586007066
AnythingElse = TypeVar("AnythingElse")
# what I would like to have is something like AnythingElse= TypeVar("AnythingElse", Not[List,Tuple])

@overload
def as_list(val: ListOrTuple) -> ListOrTuple:
...

@overload
def as_list(val: AnythingElse) -> List[AnythingElse]:
...

def as_list(val):
"""Return list/tuple as is, otherwise wrap in a list

>>> as_list("test")
['test']
"""
return val if isinstance(val, (list, tuple)) else [val]


Подробнее здесь: https://stackoverflow.com/questions/602 ... thing-else
Ответить

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

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

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

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

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