On 02/23/2012 02:31 AM, Adam Preble wrote:
I think I need to ask a better question here, so I'm coming back here with
an adjusted situation. I've found I can't get Python to bind up to
prototypes for stuff taking std::type_info or boost::type_info. I suppose
I should be surprised if it actually did. I'm thinking--what if I have a
Python implementation of an interface I defined in C++? It would be really
odd if that would even be compatible with type_info in any way. I am
thinking type_info is not the way to go, but I see some code in Boost
dealing with PyType.
Glad you sent this; I was about to reply to your last with something
that probably wouldn't have been very helpful, for the reasons you've
already noted yourself.
I figure what I need instead is a method that types something else than
type_info, but what I need is a mystery. For giggles, I just tried to take
a PyObject* and pass in whatever. if I give it from Python type(Foo) then
I think I get a PyType. I see some stuff in Boost source code about
working with these. I'm wondering, is there any helpers for this? Or any
idea at all what to do?
You can probably find out a lot from just looking at the Python C API
reference documentation for type objects. You'll need to use that
directly for a lot of your interaction with them, because there's no
Boost.Python wrapper (like there is for, say, tuple or str).
The main place you'll see them in Boost.Python is that this is actually
what a boost::python::class_ object holds under the hood; you can assign
that to a boost::python::object to get the type object without having to
carry around all the template parameters.
I suppose the overall situation is this: imagine I have a container of
pointers referencing some interface. The container contains potentially
both C++ and Python implementations. All implementations are exposed in
Python. Is there a way I could pass in some kind of type information and
be able to positively identify if something in that container matches the
type?
Yes, as long as:
- You can do the checking with a Python function that operates on type
objects, like isinstance and issubclass (or their C API equivalents,
PyObject_IsInstance and PyObject_IsSubclass).
- You are content with looking up a PyTypeObject* given a C++ type_info,
and not the other way around; you can use
boost::python::converter::registry::lookup to find the PyTypeObject for
a Boost.Python-wrapped class. That's deep in the bowels of
Boost.Python's internals - see converter/registry.hpp and
converter/registration.hpp to learn more - but it's quite usable.
Jim
_______________________________________________
Cplusplus-sig mailing list
Cplusplus-sig@python.org
http://mail.python.org/mailman/listinfo/cplusplus-sig