Optional[...]は、の省略表記でUnion[..., None]あり、特定のタイプのオブジェクトが必要であるか 、または必要であることをタイプチェッカーに通知しますNone。複雑な複合型またはそれ以上の型を含む、有効な型ヒントを...表します。デフォルト値のキーワード引数がある場合は常に、を使用する必要があります。Union[]NoneOptional
したがって、2つの例ではdict、listコンテナタイプがありますが、aキーワード引数のデフォルト値はそれNoneも許可されていることを示しているので、次を使用しますOptional[...]。
from typing import Optional
def test(a: Optional[dict] = None) -> None:
def test(a: Optional[list] = None) -> None:
で使用Optional[]するUnion[]ことNoneと、に追加することの間に技術的な違いはないことに注意してくださいUnion[]。だからOptional[Union[str, int]]、Union[str, int, None]まったく同じことです。
個人的には、デフォルト値を設定するために使用するキーワード引数のタイプを設定するときは常に使用Optional[]することに固執し= Noneます。これNoneは、許可される理由を文書化したものです。さらに、Union[...]パーツを別のタイプエイリアスに移動したりOptional[...]、引数が必須になった場合に後でパーツを削除したりするのが簡単になります。
たとえば、あなたが持っていると言う
from typing import Optional, Union
def api_function(optional_argument: Optional[Union[str, int]] = None) -> None:
"""Frob the fooznar.
If optional_argument is given, it must be an id of the fooznar subwidget
to filter on. The id should be a string, or for backwards compatibility,
an integer is also accepted.
"""
次にUnion[str, int]、をタイプエイリアスにプルすることにより、ドキュメントが改善されます。
from typing import Optional, Union
SubWidgetId = Union[str, int]
def api_function(optional_argument: Optional[SubWidgetId] = None) -> None:
"""Frob the fooznar.
If optional_argument is given, it must be an id of the fooznar subwidget
to filter on. The id should be a string, or for backwards compatibility,
an integer is also accepted.
"""
をUnion[]エイリアスに移動するためのリファクタリングは、のOptional[...]代わりに使用されたため、はるかに簡単になりましたUnion[str, int, None]。None値は、それは、値の一部ではありません、すべての後に「サブウィジェットID」ではありませんNoneフラグに値がないことを意味しています。
補足:コードがPython 3.9以降のみをサポートする必要がある場合を除いて、タイプヒントで標準ライブラリコンテナータイプを使用することは避けてください。どのタイプを含める必要があるかについては何も言えません。したがって、dictとの代わりに、それぞれとlistを使用typing.Dictしtyping.Listます。また、コンテナタイプから読み取るだけの場合は、不変の抽象コンテナタイプを受け入れることもできます。リストとタプルはSequenceオブジェクトですが、dictはMappingタイプです。
from typing import Mapping, Optional, Sequence, Union
def test(a: Optional[Mapping[str, int]] = None) -> None:
"""accepts an optional map with string keys and integer values"""
def test(a: Optional[Sequence[Union[int, str]]] = None) -> None:
"""accepts an optional sequence of integers and strings
# print(a) ==> [1, 2, 3, 4, 'a', 'b']
# or
# print(a) ==> None
Pythonの3.9とアップでは、標準コンテナの種類は、すべての参照、タイプヒントでそれらを使用してサポートするように更新されましたPEP 585。しかし、あなたが今いる間、することができます使用しdict[str, int]たりlist[Union[int, str]]、あなたはまだ、より表現を使用することもできますMappingし、Sequence(彼らは「読み取り専用」として扱われます)、および機能が作業することを関数が内容を変異されないことを示すために注釈をそれぞれマッピングまたはシーケンスとして機能するオブジェクト。
Dictし、Listタイピングや書き込みからOptional[Dict]とOptional[List]代わりにOptional[dict]...