el uso dinámico de un método de la clase definida en un módulo de extensión Cython

StackOverflow https://stackoverflow.com/questions/725777

  •  05-09-2019
  •  | 
  •  

Pregunta

Me gustaría utilizar la implementación C de un método de clase (generado a partir Cython ) si es presente, o utilizar su equivalente Python si la extensión C no está presente. La primera vez que probé este:

class A(object):
    try:
        import c_ext
        method = c_ext.optimized_method
    except ImportError:
        def method(self):
            return "foo"

Donde optimized_method es una función definida en un Cython módulo:

def optimized_method(self):
    return "fasterfoo"

Pero esto no funciona:

>>> A().method()
exceptions.TypeError: optimized_method() takes exactly one argument (0 given)

La única manera que encontré para hacer este trabajo es:

class A(object):
    def method(self):
        try:
            import c_ext
            return c_ext.optimized_method(self)
        except ImportError:
            pass
        return "foo"

Sin embargo, la comprobación de la presencia del módulo en cada llamada a la función parece bastante subóptima ... ¿Por qué no está mi primer acercamiento trabajando?

[editar]: Cython contenidos del módulo

¿Fue útil?

Solución

Ok acabo de encontrar la respuesta ...

El problema proviene de la forma Cython envuelve las funciones que exportaciones : todos los métodos no está consolidado, independientemente de donde se hace referencia a

.

La solución es declarar explícitamente un método vinculado:

class A(object):
    def method(self):
        return "foo"

try:
    import c_ext
    import types
    A.method = types.MethodType(c_ext.optimized_method, None, A)
except ImportError:
    pass
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top