mirror of
https://github.com/python/cpython.git
synced 2025-10-27 16:57:08 +00:00
gh-104922: Make PY_SSIZE_T_CLEAN not mandatory again (#105051)
This commit is contained in:
parent
f90d3f68db
commit
adccff3b3f
15 changed files with 105 additions and 397 deletions
|
|
@ -27,9 +27,18 @@ unit; the entry in (round) parentheses is the Python object type that matches
|
|||
the format unit; and the entry in [square] brackets is the type of the C
|
||||
variable(s) whose address should be passed.
|
||||
|
||||
.. _arg-parsing-string-and-buffers:
|
||||
|
||||
Strings and buffers
|
||||
-------------------
|
||||
|
||||
.. note::
|
||||
|
||||
On Python 3.12 and older, the macro :c:macro:`!PY_SSIZE_T_CLEAN` must be
|
||||
defined before including :file:`Python.h` to use all ``#`` variants of
|
||||
formats (``s#``, ``y#``, etc.) explained below.
|
||||
This is not necessary on Python 3.13 and later.
|
||||
|
||||
These formats allow accessing an object as a contiguous chunk of memory.
|
||||
You don't have to provide raw storage for the returned unicode or bytes
|
||||
area.
|
||||
|
|
@ -68,15 +77,6 @@ There are three ways strings and buffers can be converted to C:
|
|||
whether the input object is immutable (e.g. whether it would honor a request
|
||||
for a writable buffer, or whether another thread can mutate the data).
|
||||
|
||||
.. note::
|
||||
|
||||
For all ``#`` variants of formats (``s#``, ``y#``, etc.), the macro
|
||||
:c:macro:`PY_SSIZE_T_CLEAN` must be defined before including
|
||||
:file:`Python.h`. On Python 3.9 and older, the type of the length argument
|
||||
is :c:type:`Py_ssize_t` if the :c:macro:`PY_SSIZE_T_CLEAN` macro is defined,
|
||||
or int otherwise.
|
||||
|
||||
|
||||
``s`` (:class:`str`) [const char \*]
|
||||
Convert a Unicode object to a C pointer to a character string.
|
||||
A pointer to an existing string is stored in the character pointer
|
||||
|
|
|
|||
|
|
@ -70,7 +70,7 @@ the module and a copyright notice if you like).
|
|||
headers are included.
|
||||
|
||||
It is recommended to always define ``PY_SSIZE_T_CLEAN`` before including
|
||||
``Python.h``. See :ref:`parsetuple` for a description of this macro.
|
||||
``Python.h``. See :ref:`arg-parsing-string-and-buffers` for a description of this macro.
|
||||
|
||||
All user-visible symbols defined by :file:`Python.h` have a prefix of ``Py`` or
|
||||
``PY``, except those defined in standard header files. For convenience, and
|
||||
|
|
@ -649,7 +649,7 @@ Note that any Python object references which are provided to the caller are
|
|||
|
||||
Some example calls::
|
||||
|
||||
#define PY_SSIZE_T_CLEAN /* Make "s#" use Py_ssize_t rather than int. */
|
||||
#define PY_SSIZE_T_CLEAN
|
||||
#include <Python.h>
|
||||
|
||||
::
|
||||
|
|
@ -745,7 +745,7 @@ it returns false and raises an appropriate exception.
|
|||
Here is an example module which uses keywords, based on an example by Geoff
|
||||
Philbrick (philbrick@hks.com)::
|
||||
|
||||
#define PY_SSIZE_T_CLEAN /* Make "s#" use Py_ssize_t rather than int. */
|
||||
#define PY_SSIZE_T_CLEAN
|
||||
#include <Python.h>
|
||||
|
||||
static PyObject *
|
||||
|
|
|
|||
|
|
@ -292,6 +292,13 @@ C API Changes
|
|||
New Features
|
||||
------------
|
||||
|
||||
* You no longer have to define the ``PY_SSIZE_T_CLEAN`` macro before including
|
||||
:file:`Python.h` when using ``#`` formats in
|
||||
:ref:`format codes <arg-parsing-string-and-buffers>`.
|
||||
APIs accepting the format codes always use ``Py_ssize_t`` for ``#`` formats.
|
||||
(Contributed by Inada Naoki in :gh:`104922`.)
|
||||
|
||||
|
||||
Porting to Python 3.13
|
||||
----------------------
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue