类型提示中的可选联合

fla*_*kes 15 python type-hinting python-3.7

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

这适用于多个类型参数吗?IE,

确实Optional[T,U]爆发了Union[T,U,None],或者我需要把它写成Optional[Union[T,U]]

Vla*_*mir 11

您可能会将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
Run Code Online (Sandbox Code Playgroud)

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

除了从“函数式编程”的角度来看,OptionalUnion都是两个不同但众所周知且定义明确的monad。两个 monad ( Optional[T, U, None]) 的组合是另一个 monad,但它的行为与此不同Optional,因此不应如此命名。

  • 很高兴听到!在最后一段中,我的意思是 `Union[T, U, None]` 与 `Optional[Union[T, U]]` 同构(=相同),但不是一般的 `Optional[X]`。 (2认同)