Dynamische Verwendung einer Klassenmethode definiert in einem Erweiterungsmodul Cython
Frage
Ich möchte die C-Implementierung einer Klassenmethode verwenden (erzeugt aus Cython ) wenn es sich um vorhanden ist, oder seine Verwendung Python äquivalent, wenn die C-Erweiterung nicht vorhanden ist. Ich versuchte zunächst so aus:
class A(object):
try:
import c_ext
method = c_ext.optimized_method
except ImportError:
def method(self):
return "foo"
Wo optimized_method ist eine Funktion definiert in einem Cython Modul:
def optimized_method(self):
return "fasterfoo"
Aber das funktioniert nicht:
>>> A().method()
exceptions.TypeError: optimized_method() takes exactly one argument (0 given)
Die einzige Art, wie ich diese Arbeit machen gefunden ist:
class A(object):
def method(self):
try:
import c_ext
return c_ext.optimized_method(self)
except ImportError:
pass
return "foo"
Aber Prüfung auf das Vorhandensein des Moduls bei jedem Aufruf Funktion scheint ziemlich suboptimal ... Warum ist nicht mein erster Ansatz zu arbeiten?
[Bearbeiten]: hinzugefügt Cython Moduls Inhalt
Lösung
Ok, ich habe gerade die Antwort ...
Das Problem aus dem Weg kommt Cython die Funktionen wickelt es Exporte : jede Methode ungebunden ist, unabhängig von wo aus sie referenziert wird
.Die Lösung ist explizit eine gebundene Methode zu deklarieren:
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