Ich implementiere eine Cython-basierte Schnittstelle zu einer C ++ Bibliothek. Ich habe ein Callback-System implementiert, das mit normalen Funktionen funktioniert, aber beim Übergeben von gebundenen Methoden merkwürdig ausfällt. Hier ist ein Teil meines Cython-Codes:
%Vor%Und so versuche ich es zu nennen:
%Vor% Wenn dieser Code anfänglich ausgeführt wird, wird Folgendes gedruckt:
<bound method RenderCanvas.OnDrillButtonPress of <UI.RenderCanvas; proxy of <Swig Object of type 'wxGLCanvas *' at 0x42b70a8> >>
Das scheint richtig. Das Problem ist, wenn der Rückruf ausgelöst wird, wird dies gedruckt:
<bound method Shell.readline of <wx.py.shell.Shell; proxy of <Swig Object of type 'wxStyledTextCtrl *' at 0x3a12348> >>
Es wird eine völlig andere gebundene Methode aufgerufen. Wenn ich OnDrillButtonPress
jedoch zu einer statischen Methode mache,
%Code%
wird sowohl beim Initialisieren als auch beim Auslösen von Anrufen gedruckt.
Gibt es eine Inkompatibilität beim Speichern gebundener Methoden als void *?
Dank der Kommentare von Stefan Behnel und Mark Florisson zur Cython-Diskussionsgruppe ist das Problem, dass der Verweis auf meine gebundene Methode nicht mehr möglich ist und Müll gesammelt wird.
Die Lösung war, dies zu tun:
%Vor%Wenn Sie einen Verweis auf die gebundene Methode in der Klasse beibehalten, wird sie erst bereinigt, wenn sie nicht mehr verwendet wird.