我试图为包含pyd.wrap_class的D类提供
python迭代器支持.根据文档(
https://github.com/ariovistus/pyd/wiki/ClassWrap#Iterator_wrapping和
http://pyd.readthedocs.org/en/latest/classes.html#iterator-wrapping),下一个方法应该返回null以信号终止.
这是我的最小D例子:
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")) ); }
但是,使用python测试代码调用它
for item in Iteratortest() : print item
打印出一个永无止境的无流.有谁知道我在做错了什么?
解决方法
感谢DejanLekic,我找到了问题的解决方案.
正确的实现是(注意_next()方法的更改签名):
正确的实现是(注意_next()方法的更改签名):
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,PyName!("next")) ); }