summaryrefslogtreecommitdiffstats
path: root/Doc
diff options
context:
space:
mode:
authorPetr Viktorin <encukou@gmail.com>2023-05-03 13:17:14 (GMT)
committerGitHub <noreply@github.com>2023-05-03 13:17:14 (GMT)
commit524a7f77fd8244835e382f076dd4a76404580bb3 (patch)
tree2c4cf20e01075972e4861d8cfc54ec5902af1233 /Doc
parent423d7faeb37b6c13b3ebbf9255165fefc651983e (diff)
downloadcpython-524a7f77fd8244835e382f076dd4a76404580bb3.zip
cpython-524a7f77fd8244835e382f076dd4a76404580bb3.tar.gz
cpython-524a7f77fd8244835e382f076dd4a76404580bb3.tar.bz2
gh-103968: Deprecate creating heap types whose metaclass has custom tp_new. (GH-103972)
(That's a mouthful of an edge case!) Co-authored-by: Barney Gale <barney.gale@gmail.com>
Diffstat (limited to 'Doc')
-rw-r--r--Doc/c-api/type.rst26
-rw-r--r--Doc/whatsnew/3.12.rst20
2 files changed, 44 insertions, 2 deletions
diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst
index 69b1529..9fd40e1 100644
--- a/Doc/c-api/type.rst
+++ b/Doc/c-api/type.rst
@@ -256,8 +256,13 @@ The following functions and structs are used to create
The metaclass *metaclass* is used to construct the resulting type object.
When *metaclass* is ``NULL``, the metaclass is derived from *bases*
(or *Py_tp_base[s]* slots if *bases* is ``NULL``, see below).
- Note that metaclasses that override
- :c:member:`~PyTypeObject.tp_new` are not supported.
+
+ Metaclasses that override :c:member:`~PyTypeObject.tp_new` are not
+ supported.
+ (For backwards compatibility, other ``PyType_From*`` functions allow
+ such metaclasses. They ignore ``tp_new``, which may result in incomplete
+ initialization. This is deprecated and in Python 3.14+ such metaclasses will
+ not be supported.)
The *bases* argument can be used to specify base classes; it can either
be only one class or a tuple of classes.
@@ -305,6 +310,11 @@ The following functions and structs are used to create
The function now finds and uses a metaclass corresponding to the provided
base classes. Previously, only :class:`type` instances were returned.
+ The :c:member:`~PyTypeObject.tp_new` of the metaclass is *ignored*.
+ which may result in incomplete initialization.
+ Creating classes whose metaclass overrides
+ :c:member:`~PyTypeObject.tp_new` is deprecated and in Python 3.14+ it
+ will be no longer allowed.
.. c:function:: PyObject* PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
@@ -317,6 +327,12 @@ The following functions and structs are used to create
The function now finds and uses a metaclass corresponding to the provided
base classes. Previously, only :class:`type` instances were returned.
+ The :c:member:`~PyTypeObject.tp_new` of the metaclass is *ignored*.
+ which may result in incomplete initialization.
+ Creating classes whose metaclass overrides
+ :c:member:`~PyTypeObject.tp_new` is deprecated and in Python 3.14+ it
+ will be no longer allowed.
+
.. c:function:: PyObject* PyType_FromSpec(PyType_Spec *spec)
Equivalent to ``PyType_FromMetaclass(NULL, NULL, spec, NULL)``.
@@ -327,6 +343,12 @@ The following functions and structs are used to create
base classes provided in *Py_tp_base[s]* slots.
Previously, only :class:`type` instances were returned.
+ The :c:member:`~PyTypeObject.tp_new` of the metaclass is *ignored*.
+ which may result in incomplete initialization.
+ Creating classes whose metaclass overrides
+ :c:member:`~PyTypeObject.tp_new` is deprecated and in Python 3.14+ it
+ will be no longer allowed.
+
.. c:type:: PyType_Spec
Structure defining a type's behavior.
diff --git a/Doc/whatsnew/3.12.rst b/Doc/whatsnew/3.12.rst
index 3381ce7..63db5d3 100644
--- a/Doc/whatsnew/3.12.rst
+++ b/Doc/whatsnew/3.12.rst
@@ -1320,6 +1320,21 @@ Porting to Python 3.12
available on debug builds. If you happen to be using it then you'll
need to start using ``_Py_GetGlobalRefTotal()``.
+* The following functions now select an appropriate metaclass for the newly
+ created type:
+
+ * :c:func:`PyType_FromSpec`
+ * :c:func:`PyType_FromSpecWithBases`
+ * :c:func:`PyType_FromModuleAndSpec`
+
+ Creating classes whose metaclass overrides :c:member:`~PyTypeObject.tp_new`
+ is deprecated, and in Python 3.14+ it will be disallowed.
+ Note that these functions ignore ``tp_new`` of the metaclass, possibly
+ allowing incomplete initialization.
+
+ Note that :c:func:`PyType_FromMetaclass` (added in Python 3.12)
+ already disallows creating classes whose metaclass overrides ``tp_new``.
+
Deprecated
----------
@@ -1396,6 +1411,11 @@ Deprecated
* ``_PyErr_ChainExceptions`` is deprecated. Use ``_PyErr_ChainExceptions1``
instead. (Contributed by Irit Katriel in :gh:`102192`.)
+* Using :c:func:`PyType_FromSpec`, :c:func:`PyType_FromSpecWithBases`
+ or :c:func:`PyType_FromModuleAndSpec` to create a class whose metaclass
+ overrides :c:member:`~PyTypeObject.tp_new` is deprecated.
+ Call the metaclass instead.
+
Removed
-------