2016-04-07 10 views
4

私はpyd.wrap_classでラップされたDクラスに、Pythonイテレータのサポートを提供しようとしています。ドキュメント(https://github.com/ariovistus/pyd/wiki/ClassWrap#Iterator_wrappingおよびhttp://pyd.readthedocs.org/en/latest/classes.html#iterator-wrapping)によれば、nextメソッドは、信号終了にnullを返す必要があります。pydのイテレータを実装する

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 

版画私Noneの終わることのないストリーム:

は、ここに私の最小限のDの一例です。誰も私がここで間違っていることを知っていますか?

+1

、 '_nextの署名は、()'メソッドは() '' PyObject *次でなければなりません。正しい署名を使用していない可能性がありますか? – DejanLekic

+0

ええ、私はそれを試みましたが、PyObjectがどこに定義されているのか分かりません。 '' python;をインポートしようとすると、コンパイラはファイルが見つからないというエラーで失敗します。これが、私がhttp://pyd.readthedocs.org/en/latest/pydobject.htmlにある "PydObjectがPyObject *をラップする"ところの文書に従った理由です。 – harfel

+0

https://github.com/ariovistus/pyd/blob/master/infrastructure/deimos/python/object.d - PyObjectが定義されている場所です。実際には – DejanLekic

答えて

0

DejanLekicのおかげで、私はこの問題を解決しました。 正しい実装は(_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, 
     Def!(IteratorTest._iter, PyName!("__iter__")), 
     Def!(IteratorTest._next, PyName!("next")) 
    ); 
} 
関連する問題