В чем разница между литералом и союзом при наборе текста Python? - PullRequest
0 голосов
/ 19 апреля 2020

Какая разница между Literal и Union в Python наборе текста?

Я не вижу никакой разницы между ними. Может ли кто-нибудь объяснить это?

Моя IDE не отвечала мне, когда я использую как Union[2,3].

1 Ответ

1 голос
/ 19 апреля 2020

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>]

...