在类型提示系统中,Optional[T]
等效于Union[T, None]
这对多个类型参数有用吗?即
Optional[T,U]
分解成Union[T,U,None]
还是我需要写成Optional[Union[T,U]]
答案 0 :(得分:2)
您可能认为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
所以没有,即使在Optional[T, U]
库中声明它也没有麻烦,但就mypy而言,typing
是不可能的。
从“函数式编程”的角度来看,Optional
和Union
是两个截然不同但众所周知且定义明确的monads。两个单子(Optional[T, U, None]
)的组合是另一个单子,但是其行为与Optional
不同,因此不应如此命名。