Page 1 of 1

Erstellen Sie dynamisch wörtliche Alias ​​aus der Liste gültiger Werte

Posted: 07 Feb 2025, 08:03
by Anonymous
Ich habe eine Funktion, die das Argument validiert, nur Werte aus einer bestimmten Liste gültiger Optionen zu akzeptieren. In Bezug auf das Typen spiegele ich dieses Verhalten unter Verwendung eines wörtlichen Typ-Alias ​​wie SO wider:

Code: Select all

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}'
)
# ...
Dies ist ein Verstoß gegen das Trockenprinzip, da ich die Liste der gültigen Argumente in der Definition meines wörtlichen Typs neu schreiben muss, auch wenn sie bereits in der variablen valid_argumente gespeichert ist . Wie kann ich das Argument buchstäblicher Typ dynamisch erstellen, angesichts der valid_argumente variable? p>

Code: Select all

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
Kann es überhaupt durchgeführt werden?