Dynamische Verwendung einer Klassenmethode definiert in einem Erweiterungsmodul Cython

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

  •  05-09-2019
  •  | 
  •  

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

War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top