型のヒントで「null可能」な戻り値の型を指定する方法


177

関数があるとしましょう:

def get_some_date(some_argument: int=None) -> %datetime_or_None%:
    if some_argument is not None and some_argument == 1:
        return datetime.utcnow()
    else:
        return None

可能な値の戻り値の型を指定するにはどうすればよいNoneですか?

回答:


279

あなたが探していOptionalます。

あなたの戻り値の型は、いずれかになりますのでdatetime(から返されるdatetime.utcnow())、またはNoneあなたが使用する必要がありますOptional[datetime]

from typing import Optional

def get_some_date(some_argument: int=None) -> Optional[datetime]:
    # as defined

入力に関するドキュメントから、Optionalは以下の略記です:

Optional[X]と同等Union[X, None]です。

where Union[X, Y]は、型Xまたはの値を意味しますY


他の人がつまずき、そのOptional意味がわからないかもしれないという懸念のために明示的になりたい場合は、いつでも使用できますUnion

from typing import Union

def get_some_date(some_argument: int=None) -> Union[datetime, None]:

しかし、これは良いアイデアだOptionalとは思いませんが、目立つ名前であり、キーストロークをいくつか節約できます。

Michael0x2aは@でコメントで指摘したようUnion[T, None]にtranformedされるUnion[T, type(None)]必要は使用しないようにしてtypeここに。

視覚的にはこれらは異なる場合がありますが、プログラム的には、どちらの場合も結果はまったく同じです。*にUnion[datetime.datetime, NoneType]格納されるタイプになります。get_some_date.__annotations__

>>> from typing import get_type_hints
>>> print(get_type_hints(get_some_date))
{'return': typing.Union[datetime.datetime, NoneType],
 'some_argument': typing.Union[int, NoneType]}

*直接アクセスするのではなくtyping.get_type_hints、オブジェクトの__annotations__属性を取得するために使用します。


10
あなたは単純化Union[datetime, type(None)]することができます-PEP 484Union[datetime, None]よると、型注釈内での使用は常に同等であるとして扱われます。(ドキュメントは実際にはほとんどの場合に使用しますが、ここでは使用しません。これは見落としです)。Nonetype(None)typingNone
Michael0x2a

@ Michael0x2aはそれを知りませんでした、興味深い。追加されました:)
Dimitris Fasarakis Hilliard

4
私は先に進んでこれを修正するためのパッチを提出しので、近い将来、ドキュメントの一貫性が保たれることを願っています!
Michael0x2a 2016

1
このOptional[T]型は関数型プログラミングコミュニティでよく知られています。読者は、それがを意味することだけUnion[T, None]でなく、意味のある答えがない場合、エラーがある場合、または結果が見つからない場合に関数がNoneを返す使用パターンも認識します。
2019
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.