[C++-sig] Some questions ...
Mike Thompson
mike.thompson at day8.com.au
Tue Sep 9 06:33:29 CEST 2003
First, Boost.Python is a delight.
It's wonderfully functional, bug free and has quite reasonable documentation.
After a few initall issues with bjam and stlport, it's all working very, very
well for me.
My C++ library accesses objects in memory mapped databases, so I was quite
worried about technical challenges I might face in the python <-> C++
interface, but its been a breeze (so far) with Boost.Python. I now have
python based unit tests for my library which, to me, is so much easier than
having C++ based test harnesses. That alone is a huge bonus.
The main game for me soon though is building a wxPython application using this
newly wrapped library.
Based on my learning experience so far, I'd make the following simple
suggestions:
1. add a link to the Boost.Python Wiki in
http://www.boost.org/libs/python/doc/index.html.
I only found the Wiki once I started googling for answers but it would
have
been better for me if I'd seen it initially. It's pages answered some of
my
questions.
2. On the same page you might also want to mention that
'boost\libs\python\test'
contains unittests that newbies might find interesting. I certainly
found them a
useful set of examples when once or twice I was stuck.
3. At the very bottom of:
http://www.boost.org/libs/python/doc/tutorial/doc/class_operators_special_functions.html
there's a "notes box" which starts
"What is the business of operator<< .def(str(self))?"
that's got to be a mistake, I think, because I can find no mention
of operator<< .def(str(self)) on that page. The rest of
the note, after that first sentence, is fine.
So far so good, but now I have a couple of questions.
Q1. It's possible to 'graft' member functions onto a class ... like this:
class X { // ... };
void myMethod(const X& x) { // ... }
BOOST_PYTHON_MODULE(MyModule)
{
class_<X>("X")
// ...
.def("meth", &myMethod)
;
}
BUT is it possible to graft new constructors onto a class?
I realise I could create a derived class from the one I'm wrapping and
add the extra constructor there (as well as possibily replicating the
existing ones), but are there any other suggestions?
Q2. The following function works, but I'm left wondering if there's not a
better way. It takes a list of ints and returns the equivalent
vector<int>.
vector<int> makeVectorFromList(list l)
{
boost::python::object olen = l.attr("__len__")();
int len = extract<int>(olen)();
vector<int> ret(len);
for (int i = 0; i < len; ++i) {
extract<int> get_int(l[i]);
if (!get_int.check()) {
PyErr_SetString(PyExc_TypeError, "makeVectorFromList()
expects a list of ints");
throw error_already_set();
}
ret[i] = get_int();
}
return ret;
}
--
Mike
More information about the Cplusplus-sig
mailing list