我试图为包含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")) ); }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。