Utilisation dynamique d'une méthode de classe définie dans un module d'extension Cython
Question
Je voudrais utiliser l'implémentation C d'une méthode de classe (générée à partir de Cython ) si elle est présente, ou son équivalent python si l'extension de C est absent. J'ai d'abord essayé ceci:
class A(object):
try:
import c_ext
method = c_ext.optimized_method
except ImportError:
def method(self):
return "foo"
Où optimized_method est une fonction définie dans un Cython le module:
def optimized_method(self):
return "fasterfoo"
Mais cela ne fonctionne pas:
>>> A().method()
exceptions.TypeError: optimized_method() takes exactly one argument (0 given)
La seule manière que je trouvais pour faire ce travail est:
class A(object):
def method(self):
try:
import c_ext
return c_ext.optimized_method(self)
except ImportError:
pass
return "foo"
Mais la vérification de la présence à chaque appel de fonction du module semble tout à fait ... Pourquoi suboptimale pas mon premier approche fonctionne?
[modifier]: Cython contenu du module
La solution
Ok je viens de trouver la réponse ...
Le problème vient de la façon Cython enveloppe les fonctions qu'il les exportations : chaque méthode est non liée indépendamment de l'endroit où il est référencé
.La solution consiste à déclarer explicitement un procédé lié:
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