Динамически создавать псевдоним Literal из списка допустимых значений.Python

Программы на Python
Ответить
Anonymous
 Динамически создавать псевдоним Literal из списка допустимых значений.

Сообщение Anonymous »

У меня есть функция, которая проверяет свой аргумент и принимает только значения из заданного списка допустимых параметров. При наборе текста я отражаю это поведение, используя псевдоним типа 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?
Следующие вещи не работают:

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

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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