mirror of
https://github.com/pybind/pybind11.git
synced 2026-04-19 22:39:09 +00:00
* Squashed prepv300/manuscript — 30b9c268aeb98308ea42aaccfd5fe454e173c6fc — 2025-03-30 14:56:03 -0700 [skip ci] [Browse prepv300/manuscript tree](30b9c268ae) [Browse prepv300/manuscript commits](30b9c268ae/) * docs: update changelog Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com> * docs: upgrade guide CMake suggestions Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com> * Explain type_caster_enum_type_enabled, copyable_holder_caster_shared_ptr_with_smart_holder_support_enabled, move_only_holder_caster_unique_ptr_with_smart_holder_support_enabled in Upgrade guide. * Add a small section for py::bind_vector, py::bind_map & py::smart_holder * Fix tiny oversight: Reference back to the current release v2.13 (not v2.12) * Remove sentence: Using self._pybind11_conduit_v1_() ... should keep extension compatibility. This isn't true, because we also modernized `PYBIND11_PLATFORM_ABI_ID` (which I believe was absolutely necessary). I think it'll be too complicated to explain that here, and there is a mention in the Upgrade guide. * Changelog: combine #4953 and #5439 * Trivial whitespace/formatting fixes/enhancements. * chore: add more to deprecation page Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com> * docs: update for recent additions Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com> * docs: fixes and set rc1 version Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com> * fix: support rc versions Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com> * Undo erroneous copilot change: We need to use `detail::enable_if_t`, for compatibility with C++11 and C++14. * Empty lines cleanup. * Rewording of "CMake support now defaults to ..." paragraph. * Add missing backticks in upgrade guide. * Try :ref:deprecated instead of :doc:deprecated * docs: last bit of polish Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com> * Piggy-back trivial whitespace cleanup that was missed in PR #5669 --------- Signed-off-by: Henry Schreiner <henryschreineriii@gmail.com> Co-authored-by: Henry Schreiner <henryschreineriii@gmail.com>
180 lines
4.4 KiB
ReStructuredText
180 lines
4.4 KiB
ReStructuredText
.. _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).
|