python - Python类型中的Literal和Union有什么区别?
问题描述
Python 类型的Literal
和之间有什么区别?Union
我看不出它们之间有什么区别。谁能解释一下?
当我使用 like 时,我的 IDE 没有响应我Union[2,3]
。
解决方案
Union[x, y]
意思是“要么x
或y
”。Literal[5, 6]
意思是“字面意思5
或字面意思6
”(不是某个变量等于其中任何一个,而是字面意思 5
or 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]
推荐阅读
- c# - 从 CSV 读取数据行然后显示数据
- vue.js - How to passing the data to another component in vue js
- python - 如何优化以下for循环代码?
- csrf-token - CSRF token mismatch
- android - FirebaseAuth.getInstance() 总是返回 null
- sql - BCP 根据 powershell 的输出更新数据库表
- typescript - TypeScript:转换类型'a | b' 到 'a' 基于 typeof
- c++ - How to return a reference of the top object in a stack c++
- java - Progam Stopped while the condition running
- javascript - 基本算法脚本:Finders Keepers 挑战