el uso dinámico de un método de la clase definida en un módulo de extensión Cython
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
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