Boost logo

Boost Users :

From: Phil (phil.beadling_at_[hidden])
Date: 2007-06-11 17:17:37


Hi,

I'm a newbie having some problems instantiating a class written in C++
in Python using Boost.Python.

I can get a very simple example working when I expose a function outside
of a class, that returns a string, but the below fails as shown, despite
building. The enum in the same library however works fine.

I've googled the error returned from Python and I get zero hits - has
anyone get any idea what I'm doing wrong?

I'm using Python 2.5, GCC 4.0.1 and Boost 1.33 on Mac OS X 10.4.9. I
don't think it matters but I'm building the solution as a dynamic C++
bsd library in XCode and the changing the Mac OS X .dylib extention to
.so as is required by Python. This all works for simpler examples and
the enum in this example.

Error: TypeError: __init__() should return None, not 'NoneType'

Thanks,

Phil.

 From header file example.h:

enum payOffType { CALL, PUT };

class Option
{
   public:
       //defaults to call
       Option( double strike, double expiry );
       double getPutCallMultiplier();
         private:
       double strike;
       double expiry;
       payOffType type;
};

 From cpp file example.cpp:

Option::Option( double strike, double expiry ) : strike( strike ),
expiry( expiry ), type( CALL )
{
   cout << "Option Contructor called";
}

double Option::getPutCallMultiplier()
{
   return ( type == CALL ) ? 1 : -1;
}

BOOST_PYTHON_MODULE(libphil_boost)
{
   class_<Option>("Option", init<double, double>())
       .def("getPutCallMultiplier", &Option::getPutCallMultiplier)
   ;
   enum_<payOffType>("payOffType")
       .value("CALL", CALL)
       .value("PUT", PUT)
   ;

}

Using Python on the resulting .so:

$ python
Python 2.5.1 (r251:54863, Jun 10 2007, 17:57:56)
[GCC 4.0.1 (Apple Computer, Inc. build 5250)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import libphil_boost
>>> p = libphil_boost.Option( 23, 23 )
Option Contructor calledTraceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: __init__() should return None, not 'NoneType'
>>>


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net