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.

¿Es posible guardar un tipo Cython en una variable?

Tengo una clase (importada desde un archivo .h) que usa una plantilla en mi archivo pxd así:

Number.pxd

cdef extern from "myHeader.h":
    cdef cppclass Number[T]
        Number()
        ...

Lo que quiero hacer es inicializar una instancia de clase con un tipo Cython dependiendo de la entrada del usuario, por ejemplo:

archivo pyx

from Number cimport Number

def func(dtype):

    cdef Number[int] n

    if dtype == "int":
        n = Number[int]()
    elif dtype == "float":
        n = Number[float]()
    elif ... # etc

Mi pregunta es si hay una manera elegante de hacer esto sin escribir un if para cada tipo, algo como guardar un tipo en un diccionario (sé que no es posible) y luego llamarlo así:

n = Number[ dict_types[dtype] ]()

Gracias de antemano.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, hay una manera elegante de hacer esto sin escribir una declaración if para cada tipo. Una forma de lograr esto es utilizando un diccionario para almacenar los tipos y luego usar el diccionario para inicializar la instancia de clase. Aquí hay un ejemplo de cómo puede modificar el código:

    # archivo pyx
    from Number cimport Number
    
    type_dict = {
        "int": int,
        "float": float,
        # agregar más tipos según sea necesario
    }
    
    # El usuario pasa 'dtype' como argumento
    def func(dtype):
    
        n = Number[type_dict[dtype]]()
    

    Aquí, estamos almacenando cada tipo como un par clave-valor en el diccionario type_dict, donde la clave es una cadena que representa el nombre del tipo y el valor es el objeto tipo de Python correspondiente. Luego, usamos este diccionario para obtener el objeto tipo en función de la entrada del usuario y lo usamos para inicializar la instancia de clase.

    Este enfoque es más conciso y flexible que escribir una declaración if para cada tipo y es fácilmente extensible ya que puede agregar más tipos al type_dict según sea necesario sin modificar el código en la función func ().

Comments are closed.