【问题标题】:Optional Union in type hint类型提示中的可选联合
【发布时间】:2019-08-09 10:45:52
【问题描述】:

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

这是否适用于多种类型的参数?即,

Optional[T,U] 是否突破到Union[T,U,None],或者我需要写成Optional[Union[T,U]]

【问题讨论】:

  • 看起来 Optional[int, str] 给出了一个 TypeError。再说一次,Union[None, int, str] 占用的空间比可读性更强的空间更少,即Optional[Union[int, str]]
  • 这里最重要的一点是,如果您有一个函数,其参数可以是多种类型之一或什么都不是,您可能应该更明确地说明该类型的含义。 Username = typing.TypeVar('Username', str); UserId = typing.TypeVar('UserId', int); UserIdentifier = typing.Union[Username, UserId]; Optional[UserIdentifier] 现在 意味着 某事
  • @AdamSmith 我有一个实验用例,用于对数据库条目进行突变。我想为数据类中的任何字段表示三种可能的状态,其中数据类表示数据库条目上的突变。假设字段t 的类型为Tt 属于 T,因此存在并且需要更新,tNone 并且应该被忽略,或者 t 是某个标记类 type(Removal) 并且需要删除。然后我的字段看起来像foo: Optional[Union[str, Removal]]。有没有更简洁的方法来重用这种打字格式?不知何故说foo: Modifiable[str]
  • @flakes 确定!类型和其他对象一样只是对象。 Modifiable = Optional[Union[str, Removal]] 有效。
  • 如果您特别希望能够指定您的可修改类型(例如 Modifiable[str]Modifiable[int]),那么您可以像 Python 内部定义 UnionOptional 一样定义它。见gitlab.com/snippets/1836727

标签: python python-3.7 type-hinting


【解决方案1】:

您可能会将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

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

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

【讨论】:

  • 感谢mypy的教程,以后会用到!在最后一条评论中,您的意思是写 Union[T, U, None] 与可选的不同吗?
  • 很高兴听到!在最后一段中,我的意思是 Union[T, U, None]Optional[Union[T, U]] 同构(=相同),但与一般的 Optional[X] 不同。
猜你喜欢
  • 2012-09-04
  • 2020-09-22
  • 2019-05-13
  • 1970-01-01
  • 2016-06-17
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
相关资源
最近更新 更多