> How do I expose my C++ type to a user > defined python type? I think I could use boost python > class_<> wrapper to wrap around, but if I want to use > to_python/from_python convertors? > > Say I want to expose my C++ class(CA) to a python > type(PA): > > C++: > class CA > { > public: > //ctors, accessors... > private: > std::string name_; > int value_; > }; > > Python: > class PA(object): > def __init__(self, name, value): > self.name=name > self.value=value > > If I use, > > void initializeConverters() > { > using namespace boost::python; > to_python_converter<CA, > CA_to_pA>(); > } > > with > > struct CA_to_PA > { > static PyObject* convert(CA const& > s) > { > printf("In C++ -> > python converter?\n"); > > std::string > name=s.name(); > int > value=s.value(); > > #if 0 > static > boost::python::object obj; > PyObject* > obj_ptr=obj.ptr(); > > > PyObject_SetAttrString(obj_ptr, "name", > > PyString_FromString(name.c_str())); > > PyObject_SetAttrString(obj_ptr, "value", > > PyInt_FromLong(value)); > > return > boost::python::incref(obj_ptr); > #else > return > boost::python::incref( > > //PyInt_FromLong(1999) > > Py_BuildValue("s", "native string works") > > //Py_BuildValue("{s:i,s:i}", "abc", 123, "def", 456) > ); > #endif > } > }; > > How do I create a boost::python::object (or PyObject*) with > "name" and "value" attributes? I could get creation and > return of python native types to work, but can not get user > defined types returned to the python side -- always get > NoneType returned. > > boost::python::object C2Py() > { > printf("Pre assignment\n"); > > #if 0 > boost::python::object obj(new CA("From > C++ to python", 987654321)); > PyObject* o=obj.ptr(); > #else > CA a("From C++ to python", 987654321); > PyObject *o=CA_to_PA::convert(a); > #endif > > printf("Post assignment\n"); > > PyObject *tmp=NULL; > > std::string name="No Name"; > int value=-1; > > tmp=PyObject_GetAttrString(o, "name"); > if (tmp!=NULL) > name=PyString_AsString(tmp); > > tmp=PyObject_GetAttrString(o, "value"); > if (tmp!=NULL) value=PyInt_AsLong(tmp); > > printf("(%s, %d)\n", name.c_str(), > value); > > return obj; > } > > $ python > Python 2.5.1 (r251:54863, Oct 5 2007, 11:16:46) > [GCC 4.1.1 20070105 (Red Hat 4.1.1-53)] on linux2 > Type "help", "copyright", "credits" or "license" for more > information. > >>> import mytypes > >>> pa=mytypes.C2Py() > ("No Name", -1) > >>>type(pa) > NoneType > > Any help is appreciated, thanks! > Any comments? Am I asking the right question? Basically I have a simple C++ type and want to extend it to python. However, I haven't figured out a way to do the C++ to python conversion with boost python's to_python/from_python converter scheme. Am I missing something?
_______________________________________________ Cplusplus-sig mailing list Cplusplus-sig@python.org http://mail.python.org/mailman/listinfo/cplusplus-sig