'How to specify "nullable" return type with type hints
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()
else:
return None
How do I specify the return type for something that can be None?
Solution 1:[1]
You're looking for Optional.
Since your return type can either be 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 on typing, Optional is shorthand for:
Optional[X]is equivalent toUnion[X, 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 and not realize it's meaning, you could always use Union:
from typing import Union
def get_some_date(some_argument: int=None) -> Union[datetime, None]:
But I doubt this is a good idea, Optional is an indicative name and it does save a couple of keystrokes.
As pointed out in the comments by @Michael0x2a Union[T, None] is tranformed to Union[T, type(None)] so no need to use type here.
Visually these might differ but programatically, in both cases, the result is exactly the same; Union[datetime.datetime, NoneType] will be the type stored in 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]}
*Use typing.get_type_hints to grab the objects' __annotations__ attribute instead of accessing it directly.
Solution 2:[2]
You could just use the vertical line datetime | None (similar to OR operator):
def get_some_date(some_argument: int=None) -> datetime | None:
# rest of code
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 |
