Python 类型提示中的可选联合

Python 类型提示中的可选联合,python,python-3.7,type-hinting,Python,Python 3.7,Type Hinting,在类型提示系统中,Optional[T]被称为等同于Union[T,None] 这适用于多类型参数吗?即 Optional[T,U]是否中断为Union[T,U,None],或者我是否需要将其编写为Optional[Union[T,U]]您可以将库看作是关于如何声明某些类型的规范。如果该规范中没有定义某些内容,那么最好假定它是未定义的行为 然而,在python和类型的特殊情况下,我们有一种引用静态类型检查器,它是。因此,为了得到问题的答案,或者只是通过编程检查类型,我们可以使用它并查看它是否显示

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

这适用于多类型参数吗?即

Optional[T,U]
是否中断为
Union[T,U,None]
,或者我是否需要将其编写为
Optional[Union[T,U]]

您可以将库看作是关于如何声明某些类型的规范。如果该规范中没有定义某些内容,那么最好假定它是未定义的行为

然而,在python和类型的特殊情况下,我们有一种引用静态类型检查器,它是。因此,为了得到问题的答案,或者只是通过编程检查类型,我们可以使用它并查看它是否显示任何警告

下面是一个例子:

$ 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而言,
可选[T,U]
是不可能的,即使在
键入库中声明它没有问题


除了从“函数式编程”的角度来看,
Optional
Union
是两个不同但众所周知且定义明确的概念。两个单子的组合(
Optional[T,U,None]
)是另一个单子,但其行为不同于
Optional
,因此不应这样命名。

看起来像
Optional[int,str]
给出了一个类型错误。然后再次强调,
Union[None,int,str]
比可读性更强的函数占用的空间更少,即
Optional[Union[int,str]]
。这里最大的一点是,如果您有一个函数,其参数可以是多种类型中的一种,也可以是零,那么您可能应该更明确地说明该类型的含义
Username=typing.TypeVar('Username',str);UserId=typing.TypeVar('UserId',int);UserIdentifier=typing.Union[Username,UserId];可选的[UserIdentifier]
现在这意味着something@AdamSmith我有一个在数据库条目上进行突变的实验用例。我想为dataclass中的任何字段表示三种可能的状态,其中dataclass表示数据库条目上的变异。假设字段
t
的类型为
t
t
属于
t
,因此存在并需要更新,
t
属于
None
,应该忽略,
t
属于某种标记类
类型(删除)
,需要删除。然后,我的字段看起来像
foo:Optional[Union[str,removation]]
。有没有更干净的方法来重复使用这种打字格式?不知怎的,你会说:foo:Modifiable[str]
@flakes当然!类型和其他类型一样都是对象
Modifiable=Optional[Union[str,removation]
是有效的。如果您特别希望能够指定您的可修改类型(例如
Modifiable[str]
Modifiable[int]
),那么您可以用Python内部定义
Union
Optional
的方式定义它。请参阅mypy教程,我将在将来使用它!在最后的评论中,你的意思是说,
Union[T,U,None]
与可选的不同吗?很高兴听到!在最后一段中,我的意思是,
Union[T,U,None]
Optional[Union[T,U]]
同构(=相同),而不是与一般的
Optional[X]
同构。