Таможенное соединение типа сужения - PullRequest
0 голосов
/ 19 апреля 2020

Во-первых, mypy имеет встроенные возможности сужения Union до более определенных c типов с использованием isinstance. Есть также специальный случай для Optional типа.

Есть ли способ заставить mypy обрабатывать мои пользовательские типы как Optional. Например, у меня есть UnsupportedT тип:

class UnsupportedT:
    def __bool__(self) -> Literal[False]:
        return False


def inc(n: int) -> int:
    return n + 1


value: Union[UnsupportedT, None, int] = UnsupportedT()
if value:
    print(inc(value))

Тогда mypy будет жаловаться на:

main.py:34: error: Argument 1 to "inc" has incompatible type "Union[UnsupportedT, int]"; expected "int"

Использование isinstance все время слишком многословно и ограничивает стиль кодирования перебор. Например, я мог бы также использовать оператор моржа.

Так есть ли способ заставить mypy понять, что if value просто сузил тип от value до int? Может быть, mypy плагин это путь к go? Если да, то как бы я подошел к проблеме с плагином?

...