Предположим, у меня есть функция, которая допускает только 2 ввода, поэтому я бы сделал только проверку статического типа:
Код: Выделить всё
Letter: TypeAlias = Literal["a", "b"]
def my_func(letter: Letter)->str:
...
но я все равно хочу, чтобы моя функция проверяла значение во время выполнения с помощью чего-то вроде:
Код: Выделить всё
if letter not in ["a", "b"]:
raise ValueError("must enter a or b")
Теперь у меня есть два места, где ["a", "b"] должны быть жестко закодированы, чего я бы хотел избежать.
Я попробовал несколько вещей:
Код: Выделить всё
"a" in Letter
# returns False
Letter: TypeAlias = Literal(VALID_LETTERS:=["a", "b"])
# raises Literal can't be instantiate.
VALID_LETTERS=["a", "b"]
Letter: TypeAlias = Literal[VALID_LETTERS]
# Variable not allowed in type expression
Я также рассматривал возможность использования Enum, так как это поставило бы галочку о сохранении разрешенных значений для целей проверки типа и проверки времени выполнения в одном и том же месте, но это вынуждает пользователей функции импортировать класс Enum, чего я не хочу. Он также не отображает всплывающее окно с подсказкой по вводу, поэтому в данном случае это нехорошо для меня.
Есть ли способ, чтобы мои допустимые значения были жестко запрограммированы только один раз для проверки обоих типов и проверка времени выполнения?
Подробнее здесь:
https://stackoverflow.com/questions/790 ... ypealias-a