私が機能を持っていると仮定します:
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
になり得るものの戻り値の型を指定するにはどうすればよいですか?
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]
と同等です。
ここで、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]
は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__
を使用してオブジェクトを取得します。