[PyKDE] C++ wrapper at granularity of Python/C API?
Nigel Stewart
ns at fluent.com
Sun Apr 9 01:58:52 BST 2006
Hi all,
In the context of our C++/Python/Sip/Qt codebase, we've
had some need for Python-aware C++ classes that utilise
the Python/C API, along with the incref and decref pain
that comes along with that.
I've been toying with the use of boost::intrusive_ptr
and/or boost::python::api::object as C++ wrappers for
PyObject * and some of the potential advantages:
- Default constructor to 0 (no uninitialised PyObject *)
- Destructor to decref and set to 0 (no stale PyObject *)
- Safe copying with implicit incref (automatic incref/decref)
However, when it comes to mixing these "smart pointer"
style wrappers with the Python/C API, there remains
the problem of handling the different scenarios:
- New reference (ref count 1)
- Borrowed reference (ref count >0, incref for long-term use)
So, what would be very nice, would be a whole set of
wrappers for the Python/C API that deal with the reference
counting in a boost::intrusive_ptr or boost::python::api::object
friendly way to make it "idiot-proof".
boost::python encourages use of the Python/C API to the
extent of providing access to the PyObject via
boost::python::api::object::ptr(), but doesn't seem to
provide the entire Python/C API
So, one may need to write
PyCallable_Check(o.ptr());
Rather than simply:
o.Callable_Check();
The real value would be in the case of say:
{
...
o = python::List_New(10); // PyList_New produces new reference
a = o.List_GetItem(4); // PyList_GetItem returns borrowed reference
...
// We're all done without a Py_INCREF or PyDECREF, whew!
}
Am I missing something obvious in boost::python?
Kind regards,
Nigel Stewart
More information about the PyQt
mailing list