Python 类型中 Literal 和 Union 有什么区别?

Ca1*_*ack 1 python typing

LiteralPython 类型和类型之间有什么区别Union

我看不出它们之间有什么区别。有人能解释一下吗?

当我使用 like 时,我的 IDE 没有响应我Union[2,3]

For*_*Bru 8

Union[x, y]意思是“要么x或者yLiteral[5, 6]意思是“字面意思5或字面意思6(不是等于其中任何一个的变量,而是字面意思 56)。

不同之处在于 的参数Union 必须是类型。的参数Literal文字。类型名称(如intfloatMyClass)不是文字(但它们确实代表类型),因此它们不能在 中使用Literal。文字(如5'Hello!'[1,2,3])不是类型,因此它们不能在 中使用Union

例如,这些类型不正确:

Literal[str, float]  # none of the arguments are literals
Union[5, 6] # none of the arguments are types
Run Code Online (Sandbox Code Playgroud)

作为对您的评论的回应,它既None是文字又是类型。

None在Python 语法中被定义为文字:

atom: ('(' [yield_expr|testlist_comp] ')' |
       '[' [testlist_comp] ']' | # maybe list literal
       '{' [dictorsetmaker] '}' | # maybe dict/set literal
       NAME |  # NOT a literal
       NUMBER | # int/float literal
       STRING+ | # string literal
       '...' | # Ellipsis literal
       'None' | # None literal!
       'True' | 'False')
Run Code Online (Sandbox Code Playgroud)

这里,None是一个文字,因此,它可以用在 中Literal。然而,它不是一个类:

>>> import inspect
>>> inspect.isclass(None)
False
>>> inspect.isclass(5)
False
>>> inspect.isclass(str)
True
Run Code Online (Sandbox Code Playgroud)

所以,它不能用在Union. 它实际上Union:中,Union[str, None]意思是“输入str什么都不输入”。从文档中Union

您可以用作Optional[X]简写Union[X, None]