类型提示中的可选联合
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
库中声明它没有问题。
除了从“函数式编程”的角度来看,Optional
和 Union
都是两个截然不同但众所周知且定义明确的 monads。两个 monad (Union[T, U, None]
) 的组合是另一个 monad,但是它的行为不同于 Optional
,因此不应该这样命名。换句话说,Union[T, U, None]
同构于(=相同)Optional[Union[T, U]]
,而不是一般的 Optional[X]
.
在类型提示系统中,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
库中声明它没有问题。
除了从“函数式编程”的角度来看,Optional
和 Union
都是两个截然不同但众所周知且定义明确的 monads。两个 monad (Union[T, U, None]
) 的组合是另一个 monad,但是它的行为不同于 Optional
,因此不应该这样命名。换句话说,Union[T, U, None]
同构于(=相同)Optional[Union[T, U]]
,而不是一般的 Optional[X]
.