[C++-sig] How to expose to a python user defined type with to/from_python convertors?

Michele De Stefano micdestefano at gmail.com
Tue May 25 17:52:32 CEST 2010


There's a very good tutorial on writing from/to python converters.
This tutorial was suggested to me by one of the members of this
mailing list and I've found it very useful.

The link is this one:
http://misspent.wordpress.com/2009/09/27/how-to-write-boost-python-converters/

After reading this very useful article, I managed to write my
mds-utils library (the link is at the end of this e-mail) which you
can download to see how you can write a from/to python converter.

Bye.
Michele

2010/5/25 X Wang <wangx0802 at yahoo.com>:
>
>> 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 at python.org
> http://mail.python.org/mailman/listinfo/cplusplus-sig
>



-- 
Michele De Stefano
http://www.linkedin.com/in/micdestefano
http://code.google.com/p/mds-utils
http://xoomer.virgilio.it/michele_de_stefano


More information about the Cplusplus-sig mailing list