[C] Klassenfunktion aufrufen

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
BlackJack

@Chrisber: Du musst die Objekte vergleichen. `m` ist hier eine Methode:

Code: Alles auswählen

In [811]: a = A()

In [812]: a.m is a.m
Out[812]: False

In [813]: a.m == a.m
Out[813]: True
@Dauerbaustelle: Wenn man von einem Exemplar eine Methode abfragt wird da jedesmal ein *neues* Objekt zurückgegeben und das liegt halt nicht immer an der selben Adresse.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

BlackJack, danke, hatte ich noch nicht gewusst -- aber die `id(meth)` sind gleich? Dann hab ich wohl `id` falsch verstanden...
BlackJack

@Dauerbaustelle: Nein die `id()`-Werte sind nicht gleich. Wären sie gleich würde ``is`` ja `True` ergeben.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

BlackJack hat geschrieben:@Dauerbaustelle: Nein die `id()`-Werte sind nicht gleich. Wären sie gleich würde ``is`` ja `True` ergeben.
Seltsam :-/

Code: Alles auswählen

In [1]: class Foo(object):
   ...:     def meth(self):
   ...:         pass
   ...:     

In [2]: foo = Foo()

In [3]: foo.meth is foo.meth
Out[3]: False

In [4]: id(foo.meth) == id(foo.meth)
Out[4]: True
BlackJack

@Dauerbaustelle: In beiden Fällen hat man einen binären Operator bei dem erst das linke und dann das rechte Argument ausgewertet wird.

Fall 1: Links: ``foo.meth`` erzeugt ein aufrufbares Objekt an einer bestimmten Adresse. Rechts: ``foo.meth`` erzeugt ein anderes aufrufbares Objekt an einer anderen Adresse. ``is`` vergleicht die Identität der beiden unterschiedlichen Objekte.

Fall 2: Links: ``id(foo.meth)`` erzeugt ein aufrufbares Objekt an einer bestimmten Adresse, übergibt es an die `id()`-Funktion, die liefert eine Zahl, das aufrufbare Objekt wird nicht mehr gebraucht und der Speicher wird wieder freigegeben. Rechts: ``id(foo.meth)`` erzeugt ein aufrufbares Objekt an der eben gerade freigewordenen Adresse an der auch das andere Objekt lag. Die `id()`-Funktion liefert die gleiche Zahl. ``==`` ergibt bei gleichen Zahlen konsequenterweise `True`.

`id()` garantiert nur unterschiedliche Werte bei Objekten die gleichzeitig existieren. Andererseits darf man sich auf das beobachtete Verhalten auch nicht verlassen, denn das CPython für die `id()`-Funktion die Adresse liefert ist ein Implementierungsdetail. Die Implementierung könnte genausogut jedem erzeugten Objekt eine "Seriennummer" verpassen die hochgezählt wird. Jython macht das zum Beispiel so wenn ich mich recht erinnere.
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Hi.
Also im C-Code nehme ich den Callback des unten angeführten Beispiels wie folgt entgegen: http://www.python-forum.de/pastebin.php?mode=view&s=21

Das ganze ist auf das nötigste beschränkt und ist etwas zusammenkopiert, es kann daher sein das kleine Fehler im Code sind. Ich hoffe das Problem kann man irgendwie lösen :)

Gruß und Danke
Grüßle.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

BlackJack, viiielen Dank für die Ausführungen! ... wer hat sich den Scheiß eigentlich ausgedacht... :-/

Chrisber, wenn ich das richtig verstanden habe, musst du Zeile 51 mit

Code: Alles auswählen

if(PyObject_RichCompareBool(pyCallback, (*it)->pyCallback, Py_EQ)
ersetzen, damit der Code äquivalent zu

Code: Alles auswählen

a == b
ist und nicht -- wie jetzt -- zu

Code: Alles auswählen

a is b
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Perfekt Dauerbaustelle!
Woher weiß man sowas, bzw. findet das? Ich wäre niemals darauf gekommen.

Danke :)
Grüßle.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Chrisber hat geschrieben:Woher weiß man sowas, bzw. findet das? Ich wäre niemals darauf gekommen.
Von BlackJack. Siehe 8 Posts weiter oben ;)
Antworten