Python 3.10 可选参数:union 类型 vs None default

Python 3.10 optional parameter: type union vs None default

这不是什么大问题,但作为风格问题,我想知道指示 可选 函数参数的最佳方式...

在类型提示之前,参数 b:

是这样的
def my_func(a, b = None)

在 Python 3.10 之前,使用类型提示:

def my_func(a, b: Optional[str])

使用 Python 3.10 可爱的管道式表示法(参见 PEP 604):

def my_func(a, b: str | None)

后者似乎是三个选项中明显的选择,但我想知道这是否完全消除了指定 default None 值的需要,这将是:

def my_func(a, b: str | None = None)

编辑:感谢@deceze 和@jonrsharpe 指出 def my_func(a, b: str | None) 仍然需要您将值传递给 b:您必须明确地传递 None 如果你想要那个。

因此,确保 b 是可选的(即调用者 而不是 必须传递一个值的最简洁的方法是:

def my_func(a, b: str = None)

从文体上来说,合并显式类型是 def my_func(a, b: str | None = None),即显式可选类型 加上 默认 None 值,是否可以选择?

根据 PEP-484:

A past version of this PEP allowed type checkers to assume an optional type when the default value is None, as in this code:

def handle_employee(e: Employee = None): ...

This is no longer the recommended behavior. Type checkers should move towards requiring the optional type to be made explicit.

所以官方的回答是否定的。您应该为可选参数指定 ... | None = None