web-dev-qa-db-ja.com

タイプヒントのオプションのユニオン

タイプヒントシステムでは、Optional[T]Union[T, None]と同等であると言われています

これは複数の型の引数に対して機能しますか?すなわち、

Optional[T,U]Union[T,U,None]になりますか、それともOptional[Union[T,U]]と書く必要がありますか

8
flakes

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]は、typingライブラリ内で宣言するのに問題がなくても、mypyに関しては不可能です。

「関数型プログラミング」の観点からは、OptionalUnionの両方が2つの異なるものですが、よく知られており、明確に定義されています monads 。 2つのモナドの組み合わせ(Optional[T, U, None])は別のモナドですが、Optionalとは動作が異なるため、そのように名前を付けることはできません。

4
Vladimir