PEP 688: Expand backwards compatibility section (#3007)

Co-authored-by: Shantanu <12621235+hauntsaninja@users.noreply.github.com>
Co-authored-by: Hugo van Kemenade <hugovk@users.noreply.github.com>
This commit is contained in:
Jelle Zijlstra 2023-02-14 16:23:15 -08:00 committed by GitHub
parent 2b670aa514
commit 605ea6644c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 34 additions and 3 deletions

View File

@ -293,10 +293,41 @@ should deprecate and eventually remove it.
Backwards Compatibility Backwards Compatibility
======================= =======================
As the runtime changes in this PEP only add new functionality, there are ``__buffer__`` and ``__release_buffer__`` attributes
no backwards compatibility concerns. ----------------------------------------------------
However, the recommendation to remove the special behavior for As the runtime changes in this PEP only add new functionality, there are
few backwards compatibility concerns.
However, code that uses a ``__buffer__`` or ``__release_buffer__`` attribute for
other purposes may be affected. While all dunders are technically reserved for the
language, it is still good practice to ensure that a new dunder does not
interfere with too much existing code, especially widely used packages. A survey
of publicly accessible code found:
- PyPy `supports <https://doc.pypy.org/en/latest/__pypy__-module.html#generally-available-functionality>`__
a ``__buffer__`` method with compatible semantics to those proposed in this
PEP. A PyPy core developer `expressed his support <https://discuss.python.org/t/pep-688-making-the-buffer-protocol-accessible-in-python/15265/34>`__
for this PEP.
- pyzmq `implements <https://github.com/zeromq/pyzmq/blob/fe18dc55516ef50d168fc02f8550a67ff5b5633d/zmq/backend/cffi/message.py#L190>`__
a PyPy-compatible ``__buffer__`` method.
- mpi4py `defines <https://github.com/mpi4py/mpi4py/blob/453b87d0da37c5914b91afb511b188556dff2a9c/src/mpi4py/typing.py#L66>`__
a ``SupportsBuffer`` protocol that would be equivalent to this PEP's ``collections.abc.Buffer``.
- NumPy used to have an undocumented behavior where it would access a ``__buffer__`` attribute
(not method) to get an object's buffer. This was `removed <https://github.com/numpy/numpy/pull/13049>`__
in 2019 for NumPy 1.17. The behavior would have last worked in NumPy 1.16, which only supported
Python 3.7 and older. Python 3.7 will have reached its end of life by the time this PEP is expected to
be implemented.
Thus, this PEP's use of the ``__buffer__`` method will improve interoperability with
PyPy and not interfere with the current versions of any major Python packages.
No publicly accessible code uses the name ``__release_buffer__``.
Removal of the ``bytes`` special case
-------------------------------------
Separately, the recommendation to remove the special behavior for
``bytes`` in type checkers does have a backwards compatibility ``bytes`` in type checkers does have a backwards compatibility
impact on their users. An `experiment <https://github.com/python/mypy/pull/12661>`__ impact on their users. An `experiment <https://github.com/python/mypy/pull/12661>`__
with mypy shows that several major open source projects that use it with mypy shows that several major open source projects that use it