次のような 2 つの C++ クラス、Container と Item があります。
class Item{
public:
Item(std::string* name,int id);
std::string* getName();
private:
std::string* name;
int id;
};
class Container {
public:
Container();
Item* getItem(int id);
private:
std::vector<Item*> items;
};
Python で Container を作成して使用したいので、共有ライブラリをコンパイルするための C インターフェイスを作成しました。
extern "C" {
Container* Container_init(){return new Container();}
Item* Container_getItem(Container* container,int id){return container->getItem(id);}
std::string* Item_getName(Item* item){return item->getName();}
}
および Python ラッパー:
from ctypes import *
lib = cdll.LoadLibrary(myLibPath)
class Item(object):
def getName(self):
return lib.Item_getName(self.obj)
class Container(object):
def __init__(self):
self.obj = lib.Container_init()
def getItem(self,id):
return lib.Container_getItem(self.obj,id)
lib.Container_getItem.restype = Item
lib.Container_getItem.argtypes = [c_void_p,c_int]
c = Container()
print c.getItem(5).getName()
このコードを実行すると、次の行で TypeError "object() takes no parameters" が発生します
return lib.Container_getItem(self.obj,id)
ドキュメントで restype と argtype について読みましたが、明らかに何かが欠けています。Python でアイテムを返すにはどうすればよいContainer.getItem
ですか?