Erstellen Sie dynamisch wörtliche Alias aus der Liste gültiger Werte
Posted: 07 Feb 2025, 08:03
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:
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>
Kann es überhaupt durchgeführt werden?
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}'
)
# ...
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