Python 3.8+Аннотации и typingпонятие
Literal[v1, v2]
литерал
Тип, допускающий только конкретные литеральные значения. Позволяет mypy/pyright проверить, что передаётся допустимое значение.
Синтаксис
from typing import Literal
Literal['read', 'write']
Literal[1, 2, 3]
Literal живёт только в голове проверяющего типы: в рантайме ничего не сверяется, и open_file('f.txt', 'x') спокойно выполнится — нужен именно запуск mypy или pyright. Второй подвох — внутрь скобок кладут только сами литералы (строки, int, bool, None, члены Enum), не переменные и не выражения; и если положить значение в обычную переменную, её тип выведется как str, а не как Literal, поэтому такой аргумент проверка отвергнет — объявляйте переменную с типом-алиасом или как Final.
Примеры
from typing import Literal
Mode = Literal['r', 'w', 'a']
def open_file(path: str, mode: Mode) -> None:
print(f'open {path} as {mode}')
open_file('f.txt', 'r') # → open f.txt as r
open_file('f.txt', 'w') # → open f.txt as w
from typing import Literal
Direction = Literal['N', 'S', 'E', 'W']
def move(d: Direction) -> str:
return f'Moving {d}'
print(move('N')) # → Moving N
print(move('S')) # → Moving S
См. также
Открыть в полном глоссарииdocs.python.orgСообщить о неточности