Во-первых, 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? Если да, то как бы я подошел к проблеме с плагином?