Now that Python 3.10 has been released, is there any preference when indicating that a parameter or returned value might be optional, i.e., can be None
. So what is preferred:
Option 1:
def f(parameter: Optional[int]) -> Optional[str]:
Option 2:
def f(parameter: int | None) -> str | None:
Also, is there any preference between Type | None
and None | Type
?
PEP 604 covers these topics in the specification section.
The existing
typing.Union
and|
syntax should be equivalent.int | str == typing.Union[int, str]
The order of the items in the Union should not matter for equality.
(int | str) == (str | int) (int | str | float) == typing.Union[str, float, int]
Optional values should be equivalent to the new union syntax
None | t == typing.Optional[t]
As @jonrsharpe comments, Union
and Optional
are not deprecated, so the Union
and |
syntax are acceptable.
Łukasz Langa, a Python core developer, replied on a YouTube live related to the Python 3.10 release that Type | None
is preferred over Optional[Type]
for Python 3.10+.