.. _deprecated: Deprecated ########## Support for Python 3.8 is deprecated and will be removed in 3.1. Support for C++11 is deprecated and will be removed in a future version. Please use at least C++14. Support for FindPythonLibs (not available in CMake 3.26+ mode) is deprecated and will be removed in a future version. The default mode is also going to change to ``"new"`` from ``"compat"`` in the future. The following features were deprecated before pybind11 3.0, and may be removed in minor releases of pybind11 3.x. .. list-table:: Deprecated Features :header-rows: 1 :widths: 30 15 10 * - Feature - Deprecated Version - Year * - ``py::metaclass()`` - 2.1 - 2017 * - ``PYBIND11_PLUGIN`` - 2.2 - 2017 * - ``py::set_error()`` replacing ``operator()`` - 2.12 - 2024 * - ``get_type_overload`` - 2.6 - 2020 * - ``call()`` - 2.0 - 2016 * - ``.str()`` - ? - * - ``.get_type()`` - 2.6 - * - ``==`` and ``!=`` - 2.2 - 2017 * - ``.check()`` - ? - * - ``object(handle, bool)`` - ? - * - ``error_already_set.clear()`` - 2.2 - 2017 * - ``obj.attr(…)`` as ``bool`` - ? - * - ``.contains`` - ? (maybe 2.4) - * - ``py::capsule`` two-argument with destructor - ? - .. _deprecated_enum: ``py::enum_`` ============= This is the original documentation for ``py::enum_``, which is deprecated because it is not `PEP 435 compatible `_ (see also `#2332 `_). Please prefer ``py::native_enum`` (added with pybind11v3) when writing new bindings. See :ref:`native_enum` for more information. Let's suppose that we have an example class that contains internal types like enumerations, e.g.: .. code-block:: cpp struct Pet { enum Kind { Dog = 0, Cat }; struct Attributes { float age = 0; }; Pet(const std::string &name, Kind type) : name(name), type(type) { } std::string name; Kind type; Attributes attr; }; The binding code for this example looks as follows: .. code-block:: cpp py::class_ pet(m, "Pet"); pet.def(py::init()) .def_readwrite("name", &Pet::name) .def_readwrite("type", &Pet::type) .def_readwrite("attr", &Pet::attr); py::enum_(pet, "Kind") .value("Dog", Pet::Kind::Dog) .value("Cat", Pet::Kind::Cat) .export_values(); py::class_(pet, "Attributes") .def(py::init<>()) .def_readwrite("age", &Pet::Attributes::age); To ensure that the nested types ``Kind`` and ``Attributes`` are created within the scope of ``Pet``, the ``pet`` ``py::class_`` instance must be supplied to the :class:`enum_` and ``py::class_`` constructor. The :func:`enum_::export_values` function exports the enum entries into the parent scope, which should be skipped for newer C++11-style strongly typed enums. .. code-block:: pycon >>> p = Pet("Lucy", Pet.Cat) >>> p.type Kind.Cat >>> int(p.type) 1L The entries defined by the enumeration type are exposed in the ``__members__`` property: .. code-block:: pycon >>> Pet.Kind.__members__ {'Dog': Kind.Dog, 'Cat': Kind.Cat} The ``name`` property returns the name of the enum value as a unicode string. .. note:: It is also possible to use ``str(enum)``, however these accomplish different goals. The following shows how these two approaches differ. .. code-block:: pycon >>> p = Pet("Lucy", Pet.Cat) >>> pet_type = p.type >>> pet_type Pet.Cat >>> str(pet_type) 'Pet.Cat' >>> pet_type.name 'Cat' .. note:: When the special tag ``py::arithmetic()`` is specified to the ``enum_`` constructor, pybind11 creates an enumeration that also supports rudimentary arithmetic and bit-level operations like comparisons, and, or, xor, negation, etc. .. code-block:: cpp py::enum_(pet, "Kind", py::arithmetic()) ... By default, these are omitted to conserve space. .. warning:: Contrary to Python customs, enum values from the wrappers should not be compared using ``is``, but with ``==`` (see `#1177 `_ for background).