| .. _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 <https://peps.python.org/pep-0435/>`_ |
| (see also `#2332 <https://github.com/pybind/pybind11/issues/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> pet(m, "Pet"); |
| |
| pet.def(py::init<const std::string &, Pet::Kind>()) |
| .def_readwrite("name", &Pet::name) |
| .def_readwrite("type", &Pet::type) |
| .def_readwrite("attr", &Pet::attr); |
| |
| py::enum_<Pet::Kind>(pet, "Kind") |
| .value("Dog", Pet::Kind::Dog) |
| .value("Cat", Pet::Kind::Cat) |
| .export_values(); |
| |
| py::class_<Pet::Attributes>(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>(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 <https://github.com/pybind/pybind11/issues/1177>`_ for background). |