[C++-sig] Re: Automation of Python object retrieval

Pierre Barbier de Reuille pierre.barbier at cirad.fr
Sun Mar 28 11:22:42 CEST 2004


Sorry if I wasn't clear, but the problem is quite complex from my point
of view and I have problems to express it clearly.

Le dim 28/03/2004 à 07:33, David Abrahams a écrit :
> Pierre Barbier de Reuille <pierre.barbier at cirad.fr> writes:
> 
> > I have a problem with the boost::python::object contruction. I'd want to
> > know if there is a way to automate the retrieval of the existing Python
> > object when I hold a Pointer on the C++ base class and that the class is
> > extended in Python. Here's an example of what I do now :
> >
> 
> <snip big example with no mention of boost::python::object>
> 
> 
> > ======================
> >
> > All the equality tests fails because the other in detected as a Base
> > object and not a Derived object !!!
> 
> detected where?

When a function returns a base class pointer, there is a mechanism to
detect the dynamic type of the pointer (whether it's the base class or
any Derived class exported in Python). But if you just construct a
boost::python::object from a pointer, the Python type of the
boost::python::object will be the type of the pointer (whatever the
dynamic type of the object could be).

> 
> > But, if I replace the BaseWrap::operator== by :
> 
> <snip some workaround>
> 
> > I get the wanted behaviour. But I wonder if there is a cleaner method to
> > do that ? 
> 
> Sorry, I stared at your example for 5 minutes and couldn't figure out
> what you were after.  Is there a reason that Holder can't hold a
> shared_ptr<Base> or a boost::python::object?

No, there's no reasons. In the code I use, I export the classes with
smart pointers ... but it does not resolve anything. My goal is the
following:

I have an object pointed by a Base pointer. But the object's dynamic
type could be (and in practive it WILL be) a class derived from Base and
most probably the derivation occured in Python. What I want is :

 - if the dynamic type of the object is a Python class derived from Base
: construct the boost::python::object that holds the PyObject* given to
the class wrapper when constructed
 - if the dynamic type of the object is a C++ class derived from Base
and exported in Python using Boost : construct the boost::python::object
referencing the dynamic type of the object

The method I wrote do that, but it's not very clean. I hope I'm clear
enough here too :-/

Thanks,
-- 
Pierre Barbier de Reuille

INRA - UMR Cirad/Inra/Cnrs/Univ.MontpellierII AMAP
Botanique et Bio-informatique de l'Architecture des Plantes
TA40/PSII, Boulevard de la Lironde
34398 MONTPELLIER CEDEX 5, France

tel   : (33) 4 67 61 65 77    fax   : (33) 4 67 61 56 68 





More information about the Cplusplus-sig mailing list