exfizik exfizik - 11 months ago 51
Python Question

How to specify "nullable" return type with Python 3.5+ typing

Suppose I have a function:

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

How do I specify the return type for something that can be

Jim Jim
Answer Source

Since your return type can be either datetime (as returned from datetime.utcnow) or None you should use Optional[datetime]:

from typing import Optional

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

From the documentation, Optional is shorthand for:

Optional[X] is equivalent to Union[X, type(None)].

where Union[X, Y] means a value of type X or Y.

If you want to be explicit due to concerns that others might stumble on Optional you can always use Union:

from typing import Union

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

In either case the result is exactly the same; Union[datetime, NoneType] will be stored in get_some_date.__annotations__['return'].