Необязательный союз в подсказке типа - PullRequest
2 голосов
/ 19 марта 2019

В системе подсказок типа Optional[T] считается эквивалентным Union[T, None]

Это работает для аргументов нескольких типов? т.е.

Optional[T,U] выходит на Union[T,U,None] или мне нужно записать его как Optional[Union[T,U]]

1 Ответ

2 голосов
/ 19 марта 2019

Вы можете думать о библиотеке typing как о спецификации того, как объявлять определенные типы.Если что-то не определено в этой спецификации, то всегда лучше предположить, что это неопределенное поведение.

Однако в конкретном случае с python и типизацией у нас есть средство проверки статического типа с типом ссылки, которое равно mypy .Поэтому, чтобы получить ответ на ваш вопрос или просто программно проверить типы, мы можем использовать его и посмотреть, показывает ли он какие-либо предупреждения.

Вот пример:

$ cat check_optional.py 
import typing
def fn(x: typing.Optional[int, str]):
    pass
$ mypy check_optional.py 
check_optional.py:3: error: Optional[...] must have exactly one type argument

Так что нетOptional[T, U] невозможно с точки зрения mypy, даже если нет проблем с объявлением его в библиотеке typing.

Кроме того, с точки зрения "функционального программирования", Optional и Union являются двумя различными, нохорошо известные и четко определенные монады .Комбинация из двух монад (Optional[T, U, None]) является другой монадой, которая, однако, ведет себя не так, как Optional, и поэтому не должна называться так.

...