首页 > 解决方案 > Python类型中的Literal和Union有什么区别?

问题描述

Python 类型的Literal和之间有什么区别?Union

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

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

标签: pythontyping

解决方案


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

不同之处在于 的参数Union 必须是类型。的参数Literal文字。类型名称(如int, float, MyClass)不是文字(但它们确实代表类型),因此它们不能用于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

响应您的评论,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')

这里,None是一个文字,因此,它可以用于Literal. 但是,它不是一个类:

>>> import inspect
>>> inspect.isclass(None)
False
>>> inspect.isclass(5)
False
>>> inspect.isclass(str)
True

所以,它不能用于Union. 它实际上用于Union:表示Union[str, None]“输入str没有”。从上的文档Union

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


推荐阅读