Union[x, y]
означает "либо x
, либо y
" . Literal[5, 6]
означает "буквально 5
или буквально 6
" (не некоторая переменная, равная какой-либо из них, но буквально 5
или 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, <b>None</b>]