Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

346
Visualizações
escribiendo: crear dinámicamente alias literales a partir de la lista de valores válidos

Tengo una función que valida su argumento para aceptar solo valores de una lista dada de opciones válidas. En cuanto a la escritura, reflejo este comportamiento usando un alias de tipo Literal , así:

 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}' ) # ...

Esto es una violación del principio DRY, porque tengo que volver a escribir la lista de argumentos válidos en la definición de mi tipo Literal, incluso si ya está almacenada en la variable VALID_ARGUMENTS . ¿Cómo puedo crear dinámicamente el tipo Argument Literal, dada la variable VALID_ARGUMENTS ?

Las siguientes cosas no funcionan:

 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

Entonces, ¿cómo se puede hacer? ¿O no se puede hacer en absoluto?

over 4 years ago · Hanz Gallego
3 Respostas
Responde à pergunta

0

Vaya al revés y VALID_ARGUMENTS a partir de Argument :

 Argument = typing.Literal['foo', 'bar'] VALID_ARGUMENTS: typing.Tuple[Argument, ...] = typing.get_args(Argument)

Es posible en tiempo de ejecución crear Argument a partir de VALID_ARGUMENTS , pero hacerlo es incompatible con el análisis estático, que es el caso de uso principal de las anotaciones de tipo. Construir VALID_ARGUMENTS a partir de Argument es el camino a seguir.

He usado una tupla para VALID_ARGUMENTS aquí, pero si por alguna razón realmente prefiere una lista, puede obtener una:

 VALID_ARGUMENTS: typing.List[Argument] = list(typing.get_args(Argument))
over 4 years ago · Hanz Gallego Relatório

0

Aquí está la solución para esto. Pero no sé si es una buena solución.

 VALID_ARGUMENTS = ['foo', 'bar'] Argument = Literal['1'] Argument.__args__ = tuple(VALID_ARGUMENTS) print(Argument) # typing.Literal['foo', 'bar']
over 4 years ago · Hanz Gallego Relatório

0

Si alguien todavía está buscando una solución para esto:

 typing.Literal[tuple(VALID_ARGUMENTS)]
over 4 years ago · Hanz Gallego Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda