回答:
あなたが探してい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__
属性を取得するために使用します。
Optional[T]
型は関数型プログラミングコミュニティでよく知られています。読者は、それがを意味することだけUnion[T, None]
でなく、意味のある答えがない場合、エラーがある場合、または結果が見つからない場合に関数がNoneを返す使用パターンも認識します。
Union[datetime, type(None)]
することができます-PEP 484にUnion[datetime, None]
よると、型注釈内での使用は常に同等であるとして扱われます。(ドキュメントは実際にはほとんどの場合に使用しますが、ここでは使用しません。これは見落としです)。None
type(None)
typing
None