Как использовать тип данных Literal в python?

Я хочу, чтобы моя функция принимала только две строки 'male' и 'female'. В библиотеке tkinter в инициализации класса Label есть параметр justify: Literal['left', 'center', 'right'](принимает только эти три строки). Как мне использовать тип данных Literal?


Ответы (1 шт):

Автор решения: Алексей Р

Смотря какое поведение вы ожидаете от функции. Если просто подсветить и хинт вывести, что аргумент не подходит, то можно обойтись и указанием типов аргументов. Если же вам нужно запретить использование невалидных аргументов в функции, то нужно их проверить и отреагировать. Ниже 3 варианта, как это сделать:

from typing import *


def example(justify: Literal['left', 'center', 'right']):
    return justify


def example2(justify):
    valid_list = ['left', 'center', 'right']
    if justify not in valid_list:
        raise TypeError(f'Некорректное значение аргумента: {justify}. Ожидалось {valid_list}')
    return justify


def example3(justify: Literal['left', 'center', 'right']):
    valid_list = ['left', 'center', 'right']
    if justify not in valid_list:
        raise TypeError(f'Некорректное значение аргумента: {justify}. Ожидалось {valid_list}')
    return justify


print(example('another'))  # аргумент подсвечивается в IDE и выдает хинт "Expected type 'Literal['left', 'center', 'right']', got 'Literal['another']' instead"
print(example2('another'))  # выбрасывает исключение с описанием ошибки
print(example3('another'))  # и подсвечивает аргумент и выбрасывает исключение
another
Traceback (most recent call last):
  File "C:\Users\Alex20\PycharmProjects\test\main.py", line 49, in <module>
    print(example2('another'))  # выбрасывает исключение с описанием ошибки
          ^^^^^^^^^^^^^^^^^^^
  File "C:\Users\Alex20\PycharmProjects\test\main.py", line 44, in example2
    raise TypeError(f'Некорректное значение аргумента: {justify}. Ожидалось {valid_list}')
TypeError: Некорректное значение аргумента: another. Ожидалось ['left', 'center', 'right']

Как видно, в 1 случае невалидный аргумент проходит обработку и функция возвращает значение. Во 2-м и третьем (совмещенном) вариантах выполнение кода останавливается и выводится сообщение об ошибке.

→ Ссылка