2016-04-07 12 views
4

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?

+1

Gemäß der Dokumentation, die Unterschrift des '_Next()' Methode sollte 'PyObject * next()' sein. Könnte es sein, dass Sie nicht die richtige Signatur verwenden? – DejanLekic

+0

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

+0

https://github.com/ariovistus/pyd/blob/master/infrastructure/deimos/python/object.d - hier ist das PyObject definiert. – DejanLekic

Antwort

0

Dank DejanLekic fand ich die Lösung für das Problem. Die korrekte Umsetzung ist (beachten Sie die geänderte Signatur der _next()-Methode):

import pyd.pyd; 
import pyd.class_wrap; 
import deimos.python.object; 

class IteratorTest 
{ 
    IteratorTest _iter() 
    { 
     return this; 
    } 

    PyObject *_next() 
    { 
     return null; 
    } 

} 

extern(C) void PydMain() { 
    module_init(); 

    wrap_class!(
     IteratorTest, 
     Def!(IteratorTest._iter, PyName!("__iter__")), 
     Def!(IteratorTest._next, PyName!("next")) 
    ); 
}