Python 3.10可选参数:类型联合 vs None默认值

5

这并不是一个巨大的问题,但从风格上考虑,我想知道如何最好地指示可选函数参数...

在类型提示之前,参数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)

三种选项中,后者似乎是显而易见的选择,但我想知道这是否完全消除了需要指定默认的None值,其值为:

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

编辑:感谢@deceze和@jonrsharpe指出def my_func(a, b: str | None)仍需要您传递一个值到b:如果您想要这个值为None,则必须显式地传递None

因此,最简洁的方法是确保b是可选的(即调用者不需要传递任何值):

def my_func(a, b: str = None)

在风格上,包含显式类型声明的方式是def my_func(a, b: str | None = None),也就是显式的可选类型加上默认值None,这种方式是否一直都是一个选项?


3
类型提示并不会替换默认值。仅使用 b: Optional[str] 时,实际上在调用函数时仍需要传递一个值给 b - deceze
1
def my_func(a,b: Optional[str]) 中,b 不是可选的(但您_可以_明确传递None)! - jonrsharpe
是的,在我写完帖子之后我刚测试了一下(捂脸!)。从语义上讲,我认为这是 Python 类型系统中的一个小漏洞:将参数标记为可选的(使用旧的或新的管道样式)应该真正将默认值设为 None。 - Cornel Masson
已通过上面的编辑进行了更正。 - Cornel Masson
1个回答

11
根据 PEP-484 的规定:
过去版本的PEP允许类型检查器在默认值为None时假定可选类型,如下代码所示: def handle_employee(e: Employee = None): ... 这不再是建议采用的行为。类型检查器应朝着要求显式指定可选类型的方向发展。
因此,官方答案是否定的。 对于可选参数,应该指定... | None = None。

3
这指的是省略 None _type_,而不是 None _value_。你永远不能省略值(那会改变实际运行时的行为,类型提示并不会这样做)。 - jonrsharpe
1
@jon 是的,这是对编辑后问题的答案,但基本上同时回答了两个问题。 - Bharel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接