Skip to content

Commit

Permalink
pythongh-103968: What's New: Add porting hints for PyType_From with m…
Browse files Browse the repository at this point in the history
…etaclasses (pythonGH-105698)
  • Loading branch information
encukou committed Jul 11, 2023
1 parent e5c32a8 commit af5cf1e
Showing 1 changed file with 25 additions and 1 deletion.
26 changes: 25 additions & 1 deletion Doc/whatsnew/3.12.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1837,7 +1837,31 @@ Porting to Python 3.12
allowing incomplete initialization.

Note that :c:func:`PyType_FromMetaclass` (added in Python 3.12)
already disallows creating classes whose metaclass overrides ``tp_new``.
already disallows creating classes whose metaclass overrides ``tp_new``
(:meth:`~object.__new__` in Python).

Since ``tp_new`` overrides almost everything ``PyType_From*`` functions do,
the two are incompatible with each other.
The existing behavior -- ignoring the metaclass for several steps
of type creation -- is unsafe in general, since (meta)classes assume that
``tp_new`` was called.
There is no simple general workaround. One of the following may work for you:

- If you control the metaclass, avoid using ``tp_new`` in it:

- If initialization can be skipped, it can be done in
:c:member:`~PyTypeObject.tp_init` instead.
- If the metaclass doesn't need to be instantiated from Python,
set its ``tp_new`` to ``NULL`` using
the :const:`Py_TPFLAGS_DISALLOW_INSTANTIATION` flag.
This makes it acceptable for ``PyType_From*`` functions.

- Avoid ``PyType_From*`` functions: if you don't need C-specific features
(slots or setting the instance size), create types by :ref:`calling <call>`
the metaclass.

- If you *know* the ``tp_new`` can be skipped safely, filter the deprecation
warning out using :func:`warnings.catch_warnings` from Python.

* :c:var:`PyOS_InputHook` and :c:var:`PyOS_ReadlineFunctionPointer` are no
longer called in :ref:`subinterpreters <sub-interpreter-support>`. This is
Expand Down

0 comments on commit af5cf1e

Please sign in to comment.