From 8524b20c3caf8a5e868dbbf76b39927c45b41f72 Mon Sep 17 00:00:00 2001 From: Sergei Izmailov Date: Thu, 15 Sep 2022 05:56:40 +0900 Subject: [PATCH] fix: Python-3.12 compatibility (#4168) * fix: Python-3.12 compatibility Enable dynamic attributes for `pybind11_static_property` * Add future-notice comment --- include/pybind11/detail/class.h | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/include/pybind11/detail/class.h b/include/pybind11/detail/class.h index a98e5e54..528e716f 100644 --- a/include/pybind11/detail/class.h +++ b/include/pybind11/detail/class.h @@ -55,6 +55,9 @@ extern "C" inline int pybind11_static_set(PyObject *self, PyObject *obj, PyObjec return PyProperty_Type.tp_descr_set(self, cls, value); } +// Forward declaration to use in `make_static_property_type()` +inline void enable_dynamic_attributes(PyHeapTypeObject *heap_type); + /** A `static_property` is the same as a `property` but the `__get__()` and `__set__()` methods are modified to always use the object type instead of a concrete instance. Return value: New reference. */ @@ -87,6 +90,13 @@ inline PyTypeObject *make_static_property_type() { pybind11_fail("make_static_property_type(): failure in PyType_Ready()!"); } +# if PY_VERSION_HEX >= 0x030C0000 + // PRE 3.12 FEATURE FREEZE. PLEASE REVIEW AFTER FREEZE. + // Since Python-3.12 property-derived types are required to + // have dynamic attributes (to set `__doc__`) + enable_dynamic_attributes(heap_type); +# endif + setattr((PyObject *) type, "__module__", str("pybind11_builtins")); PYBIND11_SET_OLDPY_QUALNAME(type, name_obj);