PEP 674: Address Petr's review

This commit is contained in:
Victor Stinner 2022-02-07 16:09:57 +01:00
parent a46be770e5
commit e945677364
1 changed files with 49 additions and 35 deletions

View File

@ -1,5 +1,5 @@
PEP: 674
Title: Disallow using Py_TYPE() and Py_SIZE() macros as l-values
Title: Disallow using macros as l-values
Author: Victor Stinner <vstinner@python.org>
Status: Draft
Type: Standards Track
@ -10,16 +10,8 @@ Python-Version: 3.11
Abstract
========
Incompatible C API change disallowing using macros, especially
``Py_TYPE()`` and ``Py_SIZE()``, as l-values to:
* Allow evolving CPython internals (change the ``PyObject`` structure);
* Ease the C API implementation on other Python implementation;
* Help migrating existing C extensions to the HPy API.
Only 7 out of the top 5000 PyPI projects (0.1%) are affected by this
PEP. An additional 23 projects just have to regenerate their Cython
code.
Disallow using macros as l-values. For example,
``Py_TYPE(obj) = new_type`` now fails with a compiler error.
In practice, the majority of affected projects only have to make two
changes:
@ -301,6 +293,9 @@ Backwards Compatibility
The proposed C API changes are backward incompatible on purpose.
In practice, only ``Py_TYPE()`` and ``Py_SIZE()`` macros are used as
l-values.
This change does not follow the :pep:`387` deprecation process. There is
no known way to emit a deprecation warning only when a macro is used as
an l-value, but not when it's used differently (ex: as a r-value).
@ -309,46 +304,44 @@ The following 4 macros are left unchanged to reduce the number of
affected projects: ``PyDescr_NAME()``, ``PyDescr_TYPE()``,
``PyList_GET_ITEM()`` and ``PyTuple_GET_ITEM()``.
Statistics
----------
In total (projects on PyPI and not on PyPI), 41 projects are affected by
this PEP:
* 14 projects (34%) are already fixed
* 27 projects (66%) are not fixed yet
(pending fix or generated Cython code)
On January 27, 2022, the PEP affects 27 projects (0.5%) of the top 5000
PyPI projects:
* 22 projects (0.4%) have to regenerate their Cython code
* 5 projects (0.1%) have a pending fix
Top 5000 PyPI
-------------
On January 27, 2022, a code search on the top 5000 PyPI projects found
that only 7 projects are affected (0.1%):
Projects with a pending fix (5):
* datatable (1.0.0):
`pending PR <https://github.com/h2oai/datatable/pull/3231>`__
* guppy3 (3.1.2): `fixed <https://github.com/zhuyifei1999/guppy3/commit/4cb9fcb5d75327544a6875b6caabfdffb70a7e29>`__
* pickle5 (0.0.12): backport for Python <= 3.7
* pysha3 (1.0.2): backport for Python <= 3.5
* guppy3 (3.1.2):
`fixed <https://github.com/zhuyifei1999/guppy3/commit/4cb9fcb5d75327544a6875b6caabfdffb70a7e29>`__
* python-snappy (0.6.0):
`fixed <https://github.com/andrix/python-snappy/commit/1a539d71d5b1ceaf9a2291f21f686cf53a46d707>`__
* recordclass (0.17.1):
`fixed <https://bitbucket.org/intellimath/recordclass/commits/d20d72fa3cdbdcf96c72941560041460adeecff1>`__
* scipy (1.7.3): fixed (need to update boost)
All of those projects are fixed (but not released), have a pending fix,
or should not be fixed (backports).
Moreover, 22 projects have to regenerate their Cython code.
An additional 23 projects only have to regenerate their Cython code to
use ``Py_SET_TYPE()`` and ``Py_SET_SIZE()``.
Only 2 macros are used as an l-value: ``Py_TYPE()`` and ``Py_SIZE()``.
Projects released with a fix
----------------------------
Projects released with a fix (14):
Projects released with a fix (10):
* bitarray (1.6.2):
`commit <https://github.com/ilanschnell/bitarray/commit/a0cca9f2986ec796df74ca8f42aff56c4c7103ba>`__
* boost (1.78.0): `commit
<https://github.com/boostorg/python/commit/500194edb7833d0627ce7a2595fec49d0aae2484>`__
* breezy (3.2.1): `bug report <https://bugs.launchpad.net/brz/+bug/1904868>`__
* Cython (0.29.20): `commit <https://github.com/cython/cython/commit/d8e93b332fe7d15459433ea74cd29178c03186bd>`__
* duplicity (0.8.18):
`commit <https://git.launchpad.net/duplicity/commit/duplicity/_librsyncmodule.c?id=bbaae91b5ac6ef7e295968e508522884609fbf84>`__
* gobject-introspection (1.70.0):
`MR <https://gitlab.gnome.org/GNOME/gobject-introspection/-/merge_requests/243>`__
* immutables (0.15):
`commit <https://github.com/MagicStack/immutables/commit/45105ecd8b56a4d88dbcb380fcb8ff4b9cc7b19c>`__
* mercurial (5.7):
@ -364,9 +357,30 @@ Projects released with a fix (14):
* PyGObject (3.42.0)
* pyside2 (5.15.1):
`bug report <https://bugreports.qt.io/browse/PYSIDE-1436>`__
* python-zstd (1.5.0.3):
* zstd (1.5.0.3):
`commit <https://github.com/sergey-dryabzhinsky/python-zstd/commit/8aa6d7a4b250e1f0a4e27b4107c39dc516c87f96>`__
There are also two backport projects which are affected by this PEP:
* pickle5 (0.0.12): backport for Python <= 3.7
* pysha3 (1.0.2): backport for Python <= 3.5
They must not be used and cannot be used on Python 3.11.
Other affected projects
-----------------------
Other projects released with a fix (4):
* boost (1.78.0):
`commit <https://github.com/boostorg/python/commit/500194edb7833d0627ce7a2595fec49d0aae2484>`__
* breezy (3.2.1):
`bug report <https://bugs.launchpad.net/brz/+bug/1904868>`__
* duplicity (0.8.18):
`commit <https://git.launchpad.net/duplicity/commit/duplicity/_librsyncmodule.c?id=bbaae91b5ac6ef7e295968e508522884609fbf84>`__
* gobject-introspection (1.70.0):
`MR <https://gitlab.gnome.org/GNOME/gobject-introspection/-/merge_requests/243>`__
Relationship with the HPy project
=================================