Ich versuche, Python-Iterator-Unterstützung für eine D-Klasse mit pyd.wrap_class umsponnen bereitzustellen. Entsprechend der Dokumentation (https://github.com/ariovistus/pyd/wiki/ClassWrap#Iterator_wrapping und http://pyd.readthedocs.org/en/latest/classes.html#iterator-wrapping) sollte die next
Methode null
zur Signalbeendigung zurückgeben.Implementieren von Iteratoren in PYD
Hier ist meine minimal D Beispiel:
import pyd.pyd;
import pyd.pydobject;
import pyd.class_wrap;
class IteratorTest
{
IteratorTest _iter()
{
return this;
}
PydObject _next()
{
return null;
}
}
extern(C) void PydMain() {
module_init();
wrap_class!(
IteratorTest,
Def!(IteratorTest._iter, PyName!("__iter__")),
Def!(IteratorTest._next, PyName!("next"))
);
}
jedoch Berufung auf diese mit dem Python-Testcode
for item in IteratorTest() :
print item
druckt mir ein nie endender Strom von None
. Weiß jemand, was ich hier falsch mache?
Gemäß der Dokumentation, die Unterschrift des '_Next()' Methode sollte 'PyObject * next()' sein. Könnte es sein, dass Sie nicht die richtige Signatur verwenden? – DejanLekic
Ja, ich habe das versucht, aber ich kann nicht herausfinden, wo PyObject definiert ist. Wenn ich versuche, "Python zu importieren", schlägt der Compiler mit dem Fehler "Datei nicht gefunden" fehl. Aus diesem Grund habe ich die Dokumentation auf http://pyd.readthedocs.org/en/latest/pydobject.html verfolgt, in der steht, dass "PydObject ein PyObject * umschließt". – harfel
https://github.com/ariovistus/pyd/blob/master/infrastructure/deimos/python/object.d - hier ist das PyObject definiert. – DejanLekic