Как использовать тип данных 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-м и третьем (совмещенном) вариантах выполнение кода останавливается и выводится сообщение об ошибке.