c++boost.gif (8819 bytes)Wrapping enums

Because there is in general no way to deduce that a value of arbitrary type T is an enumeration constant, py_cpp cannot automatically convert enum values to and from Python. To handle this case, you need to decide how you want the enum to show up in Python (since Python doesn't have enums). Once you have done that, you can write some simple from_python() and to_python() functions.

If you are satisfied with a Python int as a way to represent your enum values, py_cpp provides a shorthand for these functions. You just need to instantiate py::enum_as_int_converters<EnumType> where EnumType is your enumerated type. There are two convenient ways to do this:

  1. // drop into namespace py and explicitly instantiate
    namespace py {
      template class enum_as_int_converters;
    }
    
  2. // instantiate as base class in any namespace
    struct EnumTypeConverters
        : py::py_enum_as_int_converters
    {
    };
    

Either of the above is equivalent to the following declarations:

PY_BEGIN_CONVERSION_NAMESPACE // this is a gcc 2.95.2 bug workaround

  MyEnumType from_python(PyObject* x, py::Type<MyEnumType>)
  {
      return static_cast<MyEnum>(
        from_python(x, py::Type<long>()));
  }

  MyEnumType from_python(PyObject* x, py::Type<const MyEnumType&>)
  {
      return static_cast<MyEnum>(
        from_python(x, py::Type<long>()));
  }

  PyObject* to_python(MyEnumType x)
  {
      return to_python(static_cast<long>(x));
  }
PY_END_CONVERSION_NAMESPACE

This technique defines the conversions of MyEnumType in terms of the conversions for the built-in long type. You may also want to add a bunch of lines like this to your module initialization:

mymodule.add(py::to_python(enum_value_1), "enum_value_1");
mymodule.add(py::to_python(enum_value_2), "enum_value_2");
...
You can also add these to an extension class definition, if your enum happens to be local to a class and you want the analogous interface in Python:
my_class.add(py::to_python(enum_value_1), "enum_value_1");
my_class.add(py::to_python(enum_value_2), "enum_value_2");
...

© Copyright David Abrahams 2000. Permission to copy, use, modify, sell and distribute this document is granted provided this copyright notice appears in all copies. This document is provided "as is" without express or implied warranty, and with no claim as to its suitability for any purpose.

Updated: Nov 12, 2000