Типирование: динамическое создание буквенного псевдонима из списка допустимых значенийPython

Программы на Python
Гость
Типирование: динамическое создание буквенного псевдонима из списка допустимых значений

Сообщение Гость »

У меня есть функция, которая проверяет свой аргумент и принимает только значения из заданного списка допустимых параметров. При наборе текста я отражаю это поведение, используя псевдоним типа Literal, например:

Код: Выделить всё

from typing import Literal

VALID_ARGUMENTS = ['foo', 'bar']

Argument = Literal['foo', 'bar']

def func(argument: 'Argument') -> None:
if argument not in VALID_ARGUMENTS:
raise ValueError(
f'argument must be one of {VALID_ARGUMENTS}'
)
# ...
Это нарушение принципа DRY, поскольку мне приходится переписывать список допустимых аргументов в определении моего типа Literal, даже если он уже хранится в переменной VALID_ARGUMENTS
код>. Как я могу создать литеральный тип Argument динамически, учитывая переменную VALID_ARGUMENTS?
Следующие вещи не< /em> работа:

Код: Выделить всё

from typing import Literal, Union, NewType

Argument = Literal[*VALID_ARGUMENTS]  # SyntaxError: invalid syntax

Argument = Literal[VALID_ARGUMENTS]  # Parameters to generic types must be types

Argument = Literal[Union[VALID_ARGUMENTS]]  # TypeError: Union[arg, ...]: each arg must be a type. Got ['foo', 'bar'].

Argument = NewType(
'Argument',
Union[
Literal[valid_argument]
for valid_argument in VALID_ARGUMENTS
]
)  # Expected type 'Type[_T]', got 'list' instead
Итак, как это можно сделать? Или это вообще невозможно сделать?


Подробнее здесь: https://stackoverflow.com/questions/645 ... lid-values

Вернуться в «Python»