Python аннотации типов с TypeVar, который исключает типы - PullRequest
1 голос
/ 14 февраля 2020

Я пытаюсь использовать @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/599#issuecomment-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]

1 Ответ

0 голосов
/ 14 февраля 2020

Это обходной путь, который у меня есть. Это работает достаточно хорошо для меня, но мне это совсем не нравится.

# attempt to list all the "other" possible types
AnythingElse = TypeVar("AnythingElse", Set, Mapping, type, int, str, None, Callable, Set, Deque, ByteString)
ListOrTuple = TypeVar("ListOrTuple", List, Tuple, Sequence)


@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]
...