类型提示中的可选联合

Optional Union in type hint

在类型提示系统中,Optional[T] 等同于 Union[T, None]

这对多类型参数有效吗?即,

Optional[T,U]是打成Union[T,U,None]还是需要写成Optional[Union[T,U]]

您可能会认为 typing 库是关于如何声明特定类型的规范。如果该规范中未定义某些内容,那么最好将其假定为未定义的行为。

然而,在 python 和键入的特定情况下,我们有一种参考静态类型检查器,它是 mypy。因此,为了获得您问题的答案,或者只是以编程方式检查类型,我们可能会使用它并查看它是否显示任何警告。

这是一个例子:

$ cat check_optional.py 
import typing
def fn(x: typing.Optional[int, str]):
    pass
$ mypy check_optional.py 
check_optional.py:3: error: Optional[...] must have exactly one type argument

所以不,就 mypy 而言,Optional[T, U] 是不可能的,即使在 typing 库中声明它没有问题。

除了从“函数式编程”的角度来看,OptionalUnion 都是两个截然不同但众所周知且定义明确的 monads。两个 monad (Union[T, U, None]) 的组合是另一个 monad,但是它的行为不同于 Optional,因此不应该这样命名。换句话说,Union[T, U, None] 同构于(=相同)Optional[Union[T, U]],而不是一般的 Optional[X].