es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Utilizando una variable de clase para indicar el tipo en __init__

En Python, tengo una lista de “tipos permitidos” en mi clase, y en el constructor me gustaría pasar un argumento que tenga que estar en esa lista de tipos permitidos. Entonces, conceptualmente, esto es lo que me gustaría:

from typing import Union

class A:
  allowed_types = [typeA, typeB]

def __init__(self, some_argument: Union[allowed_types]):
     (hacer algo)

No estoy seguro de cómo abordar esto. ¿Cómo configurarías algo así? Tal vez haya una configuración mejor para esto, pero no estoy seguro. ¡Gracias!

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr esto en Python, puedes definir un alias de tipo para los tipos permitidos utilizando la función Type, y usarlo en las indicaciones de tipo del argumento del constructor. Aquí tienes un ejemplo de implementación:

    from typing import Type, TypeVar
    
    class A:
        typeA = TypeVar('typeA', bound='Type[type]')
        typeB = TypeVar('typeB', bound='Type[type]')
        allowed_types = [typeA, typeB]
    
        def __init__(self, some_argument: Type[allowed_types]):
            if type(some_argument) not in self.allowed_types:
                raise TypeError(f"El argumento debe ser uno de {self.allowed_types}")
            # hacer algo con some_argument aquí
    

    En esta implementación, se utiliza TypeVar para definir variables de tipo para typeA y typeB, las cuales pueden estar vinculadas a objetos Type reales utilizando el argumento bound. La lista allowed_types se define combinando estas variables de tipo en una unión utilizando la sintaxis de corchetes cuadrados.

    En el constructor, el argumento some_argument se indica el tipo utilizando la función Type, y se utiliza la unión allowed_types como su tipo. Dentro del constructor, se verifica el tipo de some_argument con respecto a la lista allowed_types, y se genera un TypeError si no se encuentra.

    Esta implementación debería permitirte pasar un argumento que debe ser uno de los tipos permitidos definidos en tu clase A.

Comments are closed.