「Pythonの型 Optionalは必須を意味することもある」

「Optional型は必須の意味合いも持つPythonの型」

PYTHON PROGRAMMING

タイピング.Optionalの頻繁な誤用と誤解を避ける方法を学ぶ

Caroline Hallによる写真

Pythonのドキュメンテーションによると、typing.OptionalはオブジェクトがNoneであることを示す便利な方法です。この概念を簡潔かつエレガントに表現する方法ですが、それは明確でしょうか?

この質問を言い換えてみましょう。Pythonの文脈で「オプション」という言葉を見たとき、それはどういう意味だと思いますか? xという名前の引数で、Optional[int]という型が指定されている場合を想像してください。おそらくintは整数を指し、だが、「Optional」はどういう意味なのでしょうか? 最初の印象はなんでしょう?

以下の2つのオプションを考慮してみましょう:

  1. xの値を指定する必要がない場合、それはオプションです。
  2. xの値はintまたはNoneのいずれかである可能性があります。

Pythonの型ヒントに精通している場合、オプション2が正しいとわかるでしょう。しかし、知らない場合… もしかすると私が間違っているかもしれませんが、Pythonを知らない人がオプション2を選ぶことは想像できません。ほとんどの人にとっては、オプション1の方が意味があるように思えます。何かがオプションであるという情報を見たとき、私は… まあ、それがオプションであると思う…という意味です。

この問題は、typing.Optional型の頻繁な誤用につながります。この記事は、この誤用を明らかにし、この型の正しい理解へのガイドとなることを目指しています。

typing.Optionalの意味

次の3つの型ヒントは等価です:

from typing import Optional, Unionx: Union[str, None]x: Optional[str]x: str | None

これらすべてが同じ情報を伝えます: xは文字列またはNoneのいずれかである可能性があるということです。これは完全に有効ですが、最初のもの(Union[str, None])はPythonの型ヒントの初期段階を表しており、必ずしも現在の方法とは言えません。その後、typingモジュールにOptionalが追加され、この概念をより簡潔かつ明確に表現する方法が提供されました。 mypyドキュメンテーションによれば:

Optional[int]などのように、Noneを許容する型変種を定義するためにOptional型修飾子を使用できます(Optional[X]Union[X, None]の短縮形として好まれます)。

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more