Back to Pybind11

Deprecated

docs/advanced/deprecated.rst

3.0.44.4 KB
Original Source

.. _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).