summaryrefslogtreecommitdiff
path: root/Doc/c-api
diff options
context:
space:
mode:
Diffstat (limited to 'Doc/c-api')
-rw-r--r--Doc/c-api/arg.rst3
-rw-r--r--Doc/c-api/init.rst38
-rw-r--r--Doc/c-api/init_config.rst234
-rw-r--r--Doc/c-api/intro.rst2
-rw-r--r--Doc/c-api/module.rst104
-rw-r--r--Doc/c-api/refcounting.rst60
-rw-r--r--Doc/c-api/reflection.rst4
-rw-r--r--Doc/c-api/structures.rst16
-rw-r--r--Doc/c-api/tuple.rst2
-rw-r--r--Doc/c-api/type.rst24
-rw-r--r--Doc/c-api/typeobj.rst29
-rw-r--r--Doc/c-api/weakref.rst6
12 files changed, 366 insertions, 156 deletions
diff --git a/Doc/c-api/arg.rst b/Doc/c-api/arg.rst
index bdaae44e24..a91b3c7c95 100644
--- a/Doc/c-api/arg.rst
+++ b/Doc/c-api/arg.rst
@@ -482,7 +482,8 @@ API Functions
*min* and no more than *max*; *min* and *max* may be equal. Additional
arguments must be passed to the function, each of which should be a pointer to a
:c:type:`PyObject*` variable; these will be filled in with the values from
- *args*; they will contain borrowed references. The variables which correspond
+ *args*; they will contain :term:`borrowed references <borrowed reference>`.
+ The variables which correspond
to optional parameters not given by *args* will not be filled in; these should
be initialized by the caller. This function returns true on success and false if
*args* is not a tuple or contains the wrong number of elements; an exception
diff --git a/Doc/c-api/init.rst b/Doc/c-api/init.rst
index 3ce689203a..5736b83f21 100644
--- a/Doc/c-api/init.rst
+++ b/Doc/c-api/init.rst
@@ -376,6 +376,12 @@ Process-wide parameters
The returned string points into static storage; the caller should not modify its
value.
+ This function should not be called before :c:func:`Py_Initialize`, otherwise
+ it returns ``NULL``.
+
+ .. versionchanged:: 3.10
+ It now returns ``NULL`` if called before :c:func:`Py_Initialize`.
+
.. c:function:: wchar_t* Py_GetPrefix()
@@ -389,6 +395,12 @@ Process-wide parameters
script at build time. The value is available to Python code as ``sys.prefix``.
It is only useful on Unix. See also the next function.
+ This function should not be called before :c:func:`Py_Initialize`, otherwise
+ it returns ``NULL``.
+
+ .. versionchanged:: 3.10
+ It now returns ``NULL`` if called before :c:func:`Py_Initialize`.
+
.. c:function:: wchar_t* Py_GetExecPrefix()
@@ -424,6 +436,12 @@ Process-wide parameters
while having :file:`/usr/local/plat` be a different filesystem for each
platform.
+ This function should not be called before :c:func:`Py_Initialize`, otherwise
+ it returns ``NULL``.
+
+ .. versionchanged:: 3.10
+ It now returns ``NULL`` if called before :c:func:`Py_Initialize`.
+
.. c:function:: wchar_t* Py_GetProgramFullPath()
@@ -437,6 +455,12 @@ Process-wide parameters
static storage; the caller should not modify its value. The value is available
to Python code as ``sys.executable``.
+ This function should not be called before :c:func:`Py_Initialize`, otherwise
+ it returns ``NULL``.
+
+ .. versionchanged:: 3.10
+ It now returns ``NULL`` if called before :c:func:`Py_Initialize`.
+
.. c:function:: wchar_t* Py_GetPath()
@@ -455,8 +479,14 @@ Process-wide parameters
can be (and usually is) modified later to change the search path for loading
modules.
+ This function should not be called before :c:func:`Py_Initialize`, otherwise
+ it returns ``NULL``.
+
.. XXX should give the exact rules
+ .. versionchanged:: 3.10
+ It now returns ``NULL`` if called before :c:func:`Py_Initialize`.
+
.. c:function:: void Py_SetPath(const wchar_t *)
@@ -638,6 +668,12 @@ Process-wide parameters
:c:func:`Py_SetPythonHome`, or the value of the :envvar:`PYTHONHOME`
environment variable if it is set.
+ This function should not be called before :c:func:`Py_Initialize`, otherwise
+ it returns ``NULL``.
+
+ .. versionchanged:: 3.10
+ It now returns ``NULL`` if called before :c:func:`Py_Initialize`.
+
.. _threads:
@@ -1077,7 +1113,7 @@ All of the following functions must be called after :c:func:`Py_Initialize`.
Get the current frame of the Python thread state *tstate*.
- Return a strong reference. Return ``NULL`` if no frame is currently
+ Return a :term:`strong reference`. Return ``NULL`` if no frame is currently
executing.
See also :c:func:`PyEval_GetFrame`.
diff --git a/Doc/c-api/init_config.rst b/Doc/c-api/init_config.rst
index dad1f90bea..db7c1f4376 100644
--- a/Doc/c-api/init_config.rst
+++ b/Doc/c-api/init_config.rst
@@ -8,46 +8,24 @@ Python Initialization Configuration
.. versionadded:: 3.8
-Structures:
-
-* :c:type:`PyConfig`
-* :c:type:`PyPreConfig`
-* :c:type:`PyStatus`
-* :c:type:`PyWideStringList`
-
-Functions:
-
-* :c:func:`PyConfig_Clear`
-* :c:func:`PyConfig_InitIsolatedConfig`
-* :c:func:`PyConfig_InitPythonConfig`
-* :c:func:`PyConfig_Read`
-* :c:func:`PyConfig_SetArgv`
-* :c:func:`PyConfig_SetBytesArgv`
-* :c:func:`PyConfig_SetBytesString`
-* :c:func:`PyConfig_SetString`
-* :c:func:`PyConfig_SetWideStringList`
-* :c:func:`PyPreConfig_InitIsolatedConfig`
-* :c:func:`PyPreConfig_InitPythonConfig`
-* :c:func:`PyStatus_Error`
-* :c:func:`PyStatus_Exception`
-* :c:func:`PyStatus_Exit`
-* :c:func:`PyStatus_IsError`
-* :c:func:`PyStatus_IsExit`
-* :c:func:`PyStatus_NoMemory`
-* :c:func:`PyStatus_Ok`
-* :c:func:`PyWideStringList_Append`
-* :c:func:`PyWideStringList_Insert`
-* :c:func:`Py_ExitStatusException`
-* :c:func:`Py_InitializeFromConfig`
-* :c:func:`Py_PreInitialize`
-* :c:func:`Py_PreInitializeFromArgs`
-* :c:func:`Py_PreInitializeFromBytesArgs`
-* :c:func:`Py_RunMain`
-* :c:func:`Py_GetArgcArgv`
-
-The preconfiguration (``PyPreConfig`` type) is stored in
-``_PyRuntime.preconfig`` and the configuration (``PyConfig`` type) is stored in
-``PyInterpreterState.config``.
+Python can be initialized with :c:func:`Py_InitializeFromConfig` and the
+:c:type:`PyConfig` structure. It can be preinitialized with
+:c:func:`Py_PreInitialize` and the :c:type:`PyPreConfig` structure.
+
+There are two kinds of configuration:
+
+* The :ref:`Python Configuration <init-python-config>` can be used to build a
+ customized Python which behaves as the regular Python. For example,
+ environments variables and command line arguments are used to configure
+ Python.
+
+* The :ref:`Isolated Configuration <init-isolated-conf>` can be used to embed
+ Python into an application. It isolates Python from the system. For example,
+ environments variables are ignored, the LC_CTYPE locale is left unchanged and
+ no signal handler is registred.
+
+The :c:func:`Py_RunMain` function can be used to write a customized Python
+program.
See also :ref:`Initialization, Finalization, and Threads <initialization>`.
@@ -55,8 +33,47 @@ See also :ref:`Initialization, Finalization, and Threads <initialization>`.
:pep:`587` "Python Initialization Configuration".
+Example
+=======
+
+Example of customized Python always running in isolated mode::
+
+ int main(int argc, char **argv)
+ {
+ PyStatus status;
+
+ PyConfig config;
+ PyConfig_InitPythonConfig(&config);
+ config.isolated = 1;
+
+ /* Decode command line arguments.
+ Implicitly preinitialize Python (in isolated mode). */
+ status = PyConfig_SetBytesArgv(&config, argc, argv);
+ if (PyStatus_Exception(status)) {
+ goto exception;
+ }
+
+ status = Py_InitializeFromConfig(&config);
+ if (PyStatus_Exception(status)) {
+ goto exception;
+ }
+ PyConfig_Clear(&config);
+
+ return Py_RunMain();
+
+ exception:
+ PyConfig_Clear(&config);
+ if (PyStatus_IsExit(status)) {
+ return status.exitcode;
+ }
+ /* Display the error message and exit the process with
+ non-zero exit code */
+ Py_ExitStatusException(status);
+ }
+
+
PyWideStringList
-----------------
+================
.. c:type:: PyWideStringList
@@ -95,7 +112,7 @@ PyWideStringList
List items.
PyStatus
---------
+========
.. c:type:: PyStatus
@@ -128,6 +145,8 @@ PyStatus
Initialization error with a message.
+ *err_msg* must not be ``NULL``.
+
.. c:function:: PyStatus PyStatus_NoMemory(void)
Memory allocation failure (out of memory).
@@ -185,7 +204,7 @@ Example::
PyPreConfig
------------
+===========
.. c:type:: PyPreConfig
@@ -315,7 +334,7 @@ PyPreConfig
.. _c-preinit:
Preinitialize Python with PyPreConfig
--------------------------------------
+=====================================
The preinitialization of Python:
@@ -324,12 +343,17 @@ The preinitialization of Python:
* Set the :ref:`Python UTF-8 Mode <utf8-mode>`
(:c:member:`PyPreConfig.utf8_mode`)
+The current preconfiguration (``PyPreConfig`` type) is stored in
+``_PyRuntime.preconfig``.
+
Functions to preinitialize Python:
.. c:function:: PyStatus Py_PreInitialize(const PyPreConfig *preconfig)
Preinitialize Python from *preconfig* preconfiguration.
+ *preconfig* must not be ``NULL``.
+
.. c:function:: PyStatus Py_PreInitializeFromBytesArgs(const PyPreConfig *preconfig, int argc, char * const *argv)
Preinitialize Python from *preconfig* preconfiguration.
@@ -337,6 +361,8 @@ Functions to preinitialize Python:
Parse *argv* command line arguments (bytes strings) if
:c:member:`~PyPreConfig.parse_argv` of *preconfig* is non-zero.
+ *preconfig* must not be ``NULL``.
+
.. c:function:: PyStatus Py_PreInitializeFromArgs(const PyPreConfig *preconfig, int argc, wchar_t * const * argv)
Preinitialize Python from *preconfig* preconfiguration.
@@ -344,6 +370,8 @@ Functions to preinitialize Python:
Parse *argv* command line arguments (wide strings) if
:c:member:`~PyPreConfig.parse_argv` of *preconfig* is non-zero.
+ *preconfig* must not be ``NULL``.
+
The caller is responsible to handle exceptions (error or exit) using
:c:func:`PyStatus_Exception` and :c:func:`Py_ExitStatusException`.
@@ -386,7 +414,7 @@ the :ref:`Python UTF-8 Mode <utf8-mode>`::
PyConfig
---------
+========
.. c:type:: PyConfig
@@ -447,8 +475,20 @@ PyConfig
Fields which are already initialized are left unchanged.
+ The :c:func:`PyConfig_Read` function only parses
+ :c:member:`PyConfig.argv` arguments once: :c:member:`PyConfig.parse_argv`
+ is set to ``2`` after arguments are parsed. Since Python arguments are
+ strippped from :c:member:`PyConfig.argv`, parsing arguments twice would
+ parse the application options as Python options.
+
:ref:`Preinitialize Python <c-preinit>` if needed.
+ .. versionchanged:: 3.10
+ The :c:member:`PyConfig.argv` arguments are now only parsed once,
+ :c:member:`PyConfig.parse_argv` is set to ``2`` after arguments are
+ parsed, and arguments are only parsed if
+ :c:member:`PyConfig.parse_argv` equals ``1``.
+
.. c:function:: void PyConfig_Clear(PyConfig *config)
Release configuration memory.
@@ -496,7 +536,7 @@ PyConfig
Default: ``NULL``.
- Part of the :ref:`Path Configuration <init-path-config>` output.
+ Part of the :ref:`Python Path Configuration <init-path-config>` output.
.. c:member:: wchar_t* base_executable
@@ -508,7 +548,7 @@ PyConfig
Default: ``NULL``.
- Part of the :ref:`Path Configuration <init-path-config>` output.
+ Part of the :ref:`Python Path Configuration <init-path-config>` output.
.. c:member:: wchar_t* base_prefix
@@ -516,7 +556,7 @@ PyConfig
Default: ``NULL``.
- Part of the :ref:`Path Configuration <init-path-config>` output.
+ Part of the :ref:`Python Path Configuration <init-path-config>` output.
.. c:member:: int buffered_stdio
@@ -598,7 +638,7 @@ PyConfig
Default: ``NULL``.
- Part of the :ref:`Path Configuration <init-path-config>` output.
+ Part of the :ref:`Python Path Configuration <init-path-config>` output.
.. c:member:: wchar_t* executable
@@ -607,7 +647,7 @@ PyConfig
Default: ``NULL``.
- Part of the :ref:`Path Configuration <init-path-config>` output.
+ Part of the :ref:`Python Path Configuration <init-path-config>` output.
.. c:member:: int faulthandler
@@ -690,7 +730,7 @@ PyConfig
Default: ``NULL``.
- Part of the :ref:`Path Configuration <init-path-config>` input.
+ Part of the :ref:`Python Path Configuration <init-path-config>` input.
.. c:member:: int import_time
@@ -781,7 +821,7 @@ PyConfig
Default: value of the ``PLATLIBDIR`` macro which is set at configure time
by ``--with-platlibdir`` (default: ``"lib"``).
- Part of the :ref:`Path Configuration <init-path-config>` input.
+ Part of the :ref:`Python Path Configuration <init-path-config>` input.
.. versionadded:: 3.9
@@ -794,7 +834,7 @@ PyConfig
Default: ``NULL``.
- Part of the :ref:`Path Configuration <init-path-config>` input.
+ Part of the :ref:`Python Path Configuration <init-path-config>` input.
.. c:member:: PyWideStringList module_search_paths
.. c:member:: int module_search_paths_set
@@ -802,14 +842,14 @@ PyConfig
Module search paths: :data:`sys.path`.
If :c:member:`~PyConfig.module_search_paths_set` is equal to 0, the
- function calculating the :ref:`Path Configuration <init-path-config>`
+ function calculating the :ref:`Python Path Configuration <init-path-config>`
overrides the :c:member:`~PyConfig.module_search_paths` and sets
:c:member:`~PyConfig.module_search_paths_set` to ``1``.
Default: empty list (``module_search_paths``) and ``0``
(``module_search_paths_set``).
- Part of the :ref:`Path Configuration <init-path-config>` output.
+ Part of the :ref:`Python Path Configuration <init-path-config>` output.
.. c:member:: int optimization_level
@@ -831,7 +871,7 @@ PyConfig
If :c:member:`~PyConfig.orig_argv` list is empty and
:c:member:`~PyConfig.argv` is not a list only containing an empty
- string, :c:func:`PyConfig_Read()` copies :c:member:`~PyConfig.argv` into
+ string, :c:func:`PyConfig_Read` copies :c:member:`~PyConfig.argv` into
:c:member:`~PyConfig.orig_argv` before modifying
:c:member:`~PyConfig.argv` (if :c:member:`~PyConfig.parse_argv` is
non-zero).
@@ -847,12 +887,22 @@ PyConfig
Parse command line arguments?
- If non-zero, parse :c:member:`~PyConfig.argv` the same way the regular
+ If equals to ``1``, parse :c:member:`~PyConfig.argv` the same way the regular
Python parses :ref:`command line arguments <using-on-cmdline>`, and strip
Python arguments from :c:member:`~PyConfig.argv`.
+ The :c:func:`PyConfig_Read` function only parses
+ :c:member:`PyConfig.argv` arguments once: :c:member:`PyConfig.parse_argv`
+ is set to ``2`` after arguments are parsed. Since Python arguments are
+ strippped from :c:member:`PyConfig.argv`, parsing arguments twice would
+ parse the application options as Python options.
+
Default: ``1`` in Python mode, ``0`` in isolated mode.
+ .. versionchanged:: 3.10
+ The :c:member:`PyConfig.argv` arguments are now only parsed if
+ :c:member:`PyConfig.parse_argv` equals to ``1``.
+
.. c:member:: int parser_debug
Parser debug mode. If greater than 0, turn on parser debugging output (for expert only, depending
@@ -865,7 +915,7 @@ PyConfig
.. c:member:: int pathconfig_warnings
- On Unix, if non-zero, calculating the :ref:`Path Configuration
+ On Unix, if non-zero, calculating the :ref:`Python Path Configuration
<init-path-config>` can log warnings into ``stderr``. If equals to 0,
suppress these warnings.
@@ -873,7 +923,7 @@ PyConfig
Default: ``1`` in Python mode, ``0`` in isolated mode.
- Part of the :ref:`Path Configuration <init-path-config>` input.
+ Part of the :ref:`Python Path Configuration <init-path-config>` input.
.. c:member:: wchar_t* prefix
@@ -882,7 +932,7 @@ PyConfig
Default: ``NULL``.
- Part of the :ref:`Path Configuration <init-path-config>` output.
+ Part of the :ref:`Python Path Configuration <init-path-config>` output.
.. c:member:: wchar_t* program_name
@@ -900,7 +950,7 @@ PyConfig
Default: ``NULL``.
- Part of the :ref:`Path Configuration <init-path-config>` input.
+ Part of the :ref:`Python Path Configuration <init-path-config>` input.
.. c:member:: wchar_t* pycache_prefix
@@ -1106,7 +1156,7 @@ the :option:`-X` command line option.
Initialization with PyConfig
-----------------------------
+============================
Function to initialize Python:
@@ -1121,6 +1171,9 @@ If :c:func:`PyImport_FrozenModules`, :c:func:`PyImport_AppendInittab` or
:c:func:`PyImport_ExtendInittab` are used, they must be set or called after
Python preinitialization and before the Python initialization.
+The current configuration (``PyConfig`` type) is stored in
+``PyInterpreterState.config``.
+
Example setting the program name::
void init_python(void)
@@ -1134,17 +1187,17 @@ Example setting the program name::
status = PyConfig_SetString(&config, &config.program_name,
L"/path/to/my_program");
if (PyStatus_Exception(status)) {
- goto fail;
+ goto exception;
}
status = Py_InitializeFromConfig(&config);
if (PyStatus_Exception(status)) {
- goto fail;
+ goto exception;
}
PyConfig_Clear(&config);
return;
- fail:
+ exception:
PyConfig_Clear(&config);
Py_ExitStatusException(status);
}
@@ -1200,7 +1253,7 @@ configuration, and then override some parameters::
.. _init-isolated-conf:
Isolated Configuration
-----------------------
+======================
:c:func:`PyPreConfig_InitIsolatedConfig` and
:c:func:`PyConfig_InitIsolatedConfig` functions create a configuration to
@@ -1213,7 +1266,7 @@ and user site directory. The C standard streams (ex: ``stdout``) and the
LC_CTYPE locale are left unchanged. Signal handlers are not installed.
Configuration files are still used with this configuration. Set the
-:ref:`Path Configuration <init-path-config>` ("output fields") to ignore these
+:ref:`Python Path Configuration <init-path-config>` ("output fields") to ignore these
configuration files and avoid the function computing the default path
configuration.
@@ -1221,7 +1274,7 @@ configuration.
.. _init-python-config:
Python Configuration
---------------------
+====================
:c:func:`PyPreConfig_InitPythonConfig` and :c:func:`PyConfig_InitPythonConfig`
functions create a configuration to build a customized Python which behaves as
@@ -1235,46 +1288,11 @@ and :ref:`Python UTF-8 Mode <utf8-mode>`
(:pep:`540`) depending on the LC_CTYPE locale, :envvar:`PYTHONUTF8` and
:envvar:`PYTHONCOERCECLOCALE` environment variables.
-Example of customized Python always running in isolated mode::
-
- int main(int argc, char **argv)
- {
- PyStatus status;
-
- PyConfig config;
- PyConfig_InitPythonConfig(&config);
- config.isolated = 1;
-
- /* Decode command line arguments.
- Implicitly preinitialize Python (in isolated mode). */
- status = PyConfig_SetBytesArgv(&config, argc, argv);
- if (PyStatus_Exception(status)) {
- goto fail;
- }
-
- status = Py_InitializeFromConfig(&config);
- if (PyStatus_Exception(status)) {
- goto fail;
- }
- PyConfig_Clear(&config);
-
- return Py_RunMain();
-
- fail:
- PyConfig_Clear(&config);
- if (PyStatus_IsExit(status)) {
- return status.exitcode;
- }
- /* Display the error message and exit the process with
- non-zero exit code */
- Py_ExitStatusException(status);
- }
-
.. _init-path-config:
-Path Configuration
-------------------
+Python Path Configuration
+=========================
:c:type:`PyConfig` contains multiple fields for the path configuration:
@@ -1354,7 +1372,7 @@ The ``__PYVENV_LAUNCHER__`` environment variable is used to set
Py_RunMain()
-------------
+============
.. c:function:: int Py_RunMain(void)
@@ -1374,7 +1392,7 @@ customized Python always running in isolated mode using
Py_GetArgcArgv()
-----------------
+================
.. c:function:: void Py_GetArgcArgv(int *argc, wchar_t ***argv)
@@ -1384,7 +1402,7 @@ Py_GetArgcArgv()
Multi-Phase Initialization Private Provisional API
---------------------------------------------------
+==================================================
This section is a private provisional API introducing multi-phase
initialization, the core feature of the :pep:`432`:
diff --git a/Doc/c-api/intro.rst b/Doc/c-api/intro.rst
index 7ca8693afa..bae5ce11b7 100644
--- a/Doc/c-api/intro.rst
+++ b/Doc/c-api/intro.rst
@@ -326,7 +326,7 @@ when it's no longer needed---or passing on this responsibility (usually to its
caller). When a function passes ownership of a reference on to its caller, the
caller is said to receive a *new* reference. When no ownership is transferred,
the caller is said to *borrow* the reference. Nothing needs to be done for a
-borrowed reference.
+:term:`borrowed reference`.
Conversely, when a calling function passes in a reference to an object, there
are two possibilities: the function *steals* a reference to the object, or it
diff --git a/Doc/c-api/module.rst b/Doc/c-api/module.rst
index 6e9474bfa4..41a705d9e9 100644
--- a/Doc/c-api/module.rst
+++ b/Doc/c-api/module.rst
@@ -264,7 +264,7 @@ of the following two module creation functions:
instead; only use this if you are sure you need it.
Before it is returned from in the initialization function, the resulting module
-object is typically populated using functions like :c:func:`PyModule_AddObject`.
+object is typically populated using functions like :c:func:`PyModule_AddObjectRef`.
.. _multi-phase-initialization:
@@ -437,26 +437,102 @@ a function called from a module execution slot (if using multi-phase
initialization), can use the following functions to help initialize the module
state:
+.. c:function:: int PyModule_AddObjectRef(PyObject *module, const char *name, PyObject *value)
+
+ Add an object to *module* as *name*. This is a convenience function which
+ can be used from the module's initialization function.
+
+ On success, return ``0``. On error, raise an exception and return ``-1``.
+
+ Return ``NULL`` if *value* is ``NULL``. It must be called with an exception
+ raised in this case.
+
+ Example usage::
+
+ static int
+ add_spam(PyObject *module, int value)
+ {
+ PyObject *obj = PyLong_FromLong(value);
+ if (obj == NULL) {
+ return -1;
+ }
+ int res = PyModule_AddObjectRef(module, "spam", obj);
+ Py_DECREF(obj);
+ return res;
+ }
+
+ The example can also be written without checking explicitly if *obj* is
+ ``NULL``::
+
+ static int
+ add_spam(PyObject *module, int value)
+ {
+ PyObject *obj = PyLong_FromLong(value);
+ int res = PyModule_AddObjectRef(module, "spam", obj);
+ Py_XDECREF(obj);
+ return res;
+ }
+
+ Note that ``Py_XDECREF()`` should be used instead of ``Py_DECREF()`` in
+ this case, since *obj* can be ``NULL``.
+
+ .. versionadded:: 3.10
+
+
.. c:function:: int PyModule_AddObject(PyObject *module, const char *name, PyObject *value)
- Add an object to *module* as *name*. This is a convenience function which can
- be used from the module's initialization function. This steals a reference to
- *value* on success. Return ``-1`` on error, ``0`` on success.
+ Similar to :c:func:`PyModule_AddObjectRef`, but steals a reference to
+ *value* on success (if it returns ``0``).
+
+ The new :c:func:`PyModule_AddObjectRef` function is recommended, since it is
+ easy to introduce reference leaks by misusing the
+ :c:func:`PyModule_AddObject` function.
.. note::
- Unlike other functions that steal references, ``PyModule_AddObject()`` only
- decrements the reference count of *value* **on success**.
+ Unlike other functions that steal references, ``PyModule_AddObject()``
+ only decrements the reference count of *value* **on success**.
This means that its return value must be checked, and calling code must
- :c:func:`Py_DECREF` *value* manually on error. Example usage::
-
- Py_INCREF(spam);
- if (PyModule_AddObject(module, "spam", spam) < 0) {
- Py_DECREF(module);
- Py_DECREF(spam);
- return NULL;
- }
+ :c:func:`Py_DECREF` *value* manually on error.
+
+ Example usage::
+
+ static int
+ add_spam(PyObject *module, int value)
+ {
+ PyObject *obj = PyLong_FromLong(value);
+ if (obj == NULL) {
+ return -1;
+ }
+ if (PyModule_AddObject(module, "spam", obj) < 0) {
+ Py_DECREF(obj);
+ return -1;
+ }
+ // PyModule_AddObject() stole a reference to obj:
+ // Py_DECREF(obj) is not needed here
+ return 0;
+ }
+
+ The example can also be written without checking explicitly if *obj* is
+ ``NULL``::
+
+ static int
+ add_spam(PyObject *module, int value)
+ {
+ PyObject *obj = PyLong_FromLong(value);
+ if (PyModule_AddObject(module, "spam", obj) < 0) {
+ Py_XDECREF(obj);
+ return -1;
+ }
+ // PyModule_AddObject() stole a reference to obj:
+ // Py_DECREF(obj) is not needed here
+ return 0;
+ }
+
+ Note that ``Py_XDECREF()`` should be used instead of ``Py_DECREF()`` in
+ this case, since *obj* can be ``NULL``.
+
.. c:function:: int PyModule_AddIntConstant(PyObject *module, const char *name, long value)
diff --git a/Doc/c-api/refcounting.rst b/Doc/c-api/refcounting.rst
index 0df12c67f4..391907c8c2 100644
--- a/Doc/c-api/refcounting.rst
+++ b/Doc/c-api/refcounting.rst
@@ -13,8 +13,14 @@ objects.
.. c:function:: void Py_INCREF(PyObject *o)
- Increment the reference count for object *o*. The object must not be ``NULL``; if
- you aren't sure that it isn't ``NULL``, use :c:func:`Py_XINCREF`.
+ Increment the reference count for object *o*.
+
+ This function is usually used to convert a :term:`borrowed reference` to a
+ :term:`strong reference` in-place. The :c:func:`Py_NewRef` function can be
+ used to create a new :term:`strong reference`.
+
+ The object must not be ``NULL``; if you aren't sure that it isn't
+ ``NULL``, use :c:func:`Py_XINCREF`.
.. c:function:: void Py_XINCREF(PyObject *o)
@@ -22,13 +28,55 @@ objects.
Increment the reference count for object *o*. The object may be ``NULL``, in
which case the macro has no effect.
+ See also :c:func:`Py_XNewRef`.
+
+
+.. c:function:: PyObject* Py_NewRef(PyObject *o)
+
+ Create a new :term:`strong reference` to an object: increment the reference
+ count of the object *o* and return the object *o*.
+
+ When the :term:`strong reference` is no longer needed, :c:func:`Py_DECREF`
+ should be called on it to decrement the object reference count.
+
+ The object *o* must not be ``NULL``; use :c:func:`Py_XNewRef` if *o* can be
+ ``NULL``.
+
+ For example::
+
+ Py_INCREF(obj);
+ self->attr = obj;
+
+ can be written as::
+
+ self->attr = Py_NewRef(obj);
+
+ See also :c:func:`Py_INCREF`.
+
+ .. versionadded:: 3.10
+
+
+.. c:function:: PyObject* Py_XNewRef(PyObject *o)
+
+ Similar to :c:func:`Py_NewRef`, but the object *o* can be NULL.
+
+ If the object *o* is ``NULL``, the function just returns ``NULL``.
+
+ .. versionadded:: 3.10
+
.. c:function:: void Py_DECREF(PyObject *o)
- Decrement the reference count for object *o*. The object must not be ``NULL``; if
- you aren't sure that it isn't ``NULL``, use :c:func:`Py_XDECREF`. If the reference
- count reaches zero, the object's type's deallocation function (which must not be
- ``NULL``) is invoked.
+ Decrement the reference count for object *o*.
+
+ If the reference count reaches zero, the object's type's deallocation
+ function (which must not be ``NULL``) is invoked.
+
+ This function is usually used to delete a :term:`strong reference` before
+ exiting its scope.
+
+ The object must not be ``NULL``; if you aren't sure that it isn't ``NULL``,
+ use :c:func:`Py_XDECREF`.
.. warning::
diff --git a/Doc/c-api/reflection.rst b/Doc/c-api/reflection.rst
index 9207d86012..64ce4d1d0c 100644
--- a/Doc/c-api/reflection.rst
+++ b/Doc/c-api/reflection.rst
@@ -35,7 +35,7 @@ Reflection
Get the *frame* next outer frame.
- Return a strong reference, or ``NULL`` if *frame* has no outer frame.
+ Return a :term:`strong reference`, or ``NULL`` if *frame* has no outer frame.
*frame* must not be ``NULL``.
@@ -46,7 +46,7 @@ Reflection
Get the *frame* code.
- Return a strong reference.
+ Return a :term:`strong reference`.
*frame* must not be ``NULL``. The result (frame code) cannot be ``NULL``.
diff --git a/Doc/c-api/structures.rst b/Doc/c-api/structures.rst
index a9e1c6fbcc..37072d30d5 100644
--- a/Doc/c-api/structures.rst
+++ b/Doc/c-api/structures.rst
@@ -66,11 +66,9 @@ the definition of all other Python objects.
Get the type of the Python object *o*.
- Return a borrowed reference.
+ Return a :term:`borrowed reference`.
- .. versionchanged:: 3.10
- :c:func:`Py_TYPE()` is changed to the inline static function.
- Use :c:func:`Py_SET_TYPE()` to set an object type.
+ The :c:func:`Py_SET_TYPE` function must be used to set an object type.
.. c:function:: int Py_IS_TYPE(PyObject *o, PyTypeObject *type)
@@ -108,9 +106,7 @@ the definition of all other Python objects.
Get the size of the Python object *o*.
- .. versionchanged:: 3.10
- :c:func:`Py_SIZE()` is changed to the inline static function.
- Use :c:func:`Py_SET_SIZE()` to set an object size.
+ The :c:func:`Py_SET_SIZE` function must be used to set an object size.
.. c:function:: void Py_SET_SIZE(PyVarObject *o, Py_ssize_t size)
@@ -263,10 +259,12 @@ There are these calling conventions:
of :c:type:`PyObject*` values indicating the arguments and the third
parameter is the number of arguments (the length of the array).
- This is not part of the :ref:`limited API <stable>`.
-
.. versionadded:: 3.7
+ .. versionchanged:: 3.10
+
+ ``METH_FASTCALL`` is now part of the stable ABI.
+
.. data:: METH_FASTCALL | METH_KEYWORDS
diff --git a/Doc/c-api/tuple.rst b/Doc/c-api/tuple.rst
index bf751e44ac..c0c14f480d 100644
--- a/Doc/c-api/tuple.rst
+++ b/Doc/c-api/tuple.rst
@@ -57,7 +57,7 @@ Tuple Objects
.. c:function:: PyObject* PyTuple_GetItem(PyObject *p, Py_ssize_t pos)
Return the object at position *pos* in the tuple pointed to by *p*. If *pos* is
- out of bounds, return ``NULL`` and set an :exc:`IndexError` exception.
+ negative or out of bounds, return ``NULL`` and set an :exc:`IndexError` exception.
.. c:function:: PyObject* PyTuple_GET_ITEM(PyObject *p, Py_ssize_t pos)
diff --git a/Doc/c-api/type.rst b/Doc/c-api/type.rst
index 73f26875d8..a869859dd4 100644
--- a/Doc/c-api/type.rst
+++ b/Doc/c-api/type.rst
@@ -105,10 +105,12 @@ Type Objects
See :c:member:`PyType_Slot.slot` for possible values of the *slot* argument.
- An exception is raised if *type* is not a heap type.
-
.. versionadded:: 3.4
+ .. versionchanged:: 3.10
+ :c:func:`PyType_GetSlot` can now accept all types.
+ Previously, it was limited to heap types.
+
.. c:function:: PyObject* PyType_GetModule(PyTypeObject *type)
Return the module object associated with the given type when the type was
@@ -152,10 +154,10 @@ The following functions and structs are used to create
Creates and returns a heap type object from the *spec*
(:const:`Py_TPFLAGS_HEAPTYPE`).
- If *bases* is a tuple, the created heap type contains all types contained
- in it as base types.
-
- If *bases* is ``NULL``, the *Py_tp_base* slot is used instead.
+ The *bases* argument can be used to specify base classes; it can either
+ be only one class or a tuple of classes.
+ If *bases* is ``NULL``, the *Py_tp_bases* slot is used instead.
+ If that also is ``NULL``, the *Py_tp_base* slot is used instead.
If that also is ``NULL``, the new type derives from :class:`object`.
The *module* argument can be used to record the module in which the new
@@ -169,6 +171,11 @@ The following functions and structs are used to create
.. versionadded:: 3.9
+ .. versionchanged:: 3.10
+
+ The function now accepts a single class as the *bases* argument and
+ ``NULL`` as the ``tp_doc`` slot.
+
.. c:function:: PyObject* PyType_FromSpecWithBases(PyType_Spec *spec, PyObject *bases)
Equivalent to ``PyType_FromModuleAndSpec(NULL, spec, bases)``.
@@ -247,7 +254,8 @@ The following functions and structs are used to create
* :c:member:`~PyBufferProcs.bf_getbuffer`
* :c:member:`~PyBufferProcs.bf_releasebuffer`
- Setting :c:data:`Py_tp_bases` may be problematic on some platforms.
+ Setting :c:data:`Py_tp_bases` or :c:data:`Py_tp_base` may be
+ problematic on some platforms.
To avoid issues, use the *bases* argument of
:py:func:`PyType_FromSpecWithBases` instead.
@@ -260,4 +268,4 @@ The following functions and structs are used to create
The desired value of the slot. In most cases, this is a pointer
to a function.
- May not be ``NULL``.
+ Slots other than ``Py_tp_doc`` may not be ``NULL``.
diff --git a/Doc/c-api/typeobj.rst b/Doc/c-api/typeobj.rst
index ddcb8ae3d0..9efe3aac2e 100644
--- a/Doc/c-api/typeobj.rst
+++ b/Doc/c-api/typeobj.rst
@@ -199,6 +199,8 @@ sub-slots
+---------------------------------------------------------+-----------------------------------+--------------+
| :c:member:`~PyAsyncMethods.am_anext` | :c:type:`unaryfunc` | __anext__ |
+---------------------------------------------------------+-----------------------------------+--------------+
+ | :c:member:`~PyAsyncMethods.am_send` | :c:type:`sendfunc` | |
+ +---------------------------------------------------------+-----------------------------------+--------------+
| |
+---------------------------------------------------------+-----------------------------------+--------------+
| :c:member:`~PyNumberMethods.nb_add` | :c:type:`binaryfunc` | __add__ |
@@ -1168,6 +1170,14 @@ and :c:type:`PyType_Type` effectively act as defaults.)
.. versionadded:: 3.9
+ .. data:: Py_TPFLAGS_HAVE_AM_SEND
+
+ This bit is set when the :c:member:`~PyAsyncMethods.am_send` entry is present in the
+ :c:member:`~PyTypeObject.tp_as_async` slot of type structure.
+
+ .. versionadded:: 3.10
+
+
.. c:member:: const char* PyTypeObject.tp_doc
An optional pointer to a NUL-terminated C string giving the docstring for this
@@ -1213,8 +1223,9 @@ and :c:type:`PyType_Type` effectively act as defaults.)
:func:`~gc.get_referents` function will include it.
.. warning::
- When implementing :c:member:`~PyTypeObject.tp_traverse`, only the members
- that the instance *owns* (by having strong references to them) must be
+ When implementing :c:member:`~PyTypeObject.tp_traverse`, only the
+ members that the instance *owns* (by having :term:`strong references
+ <strong reference>` to them) must be
visited. For instance, if an object supports weak references via the
:c:member:`~PyTypeObject.tp_weaklist` slot, the pointer supporting
the linked list (what *tp_weaklist* points to) must **not** be
@@ -2303,6 +2314,7 @@ Async Object Structures
unaryfunc am_await;
unaryfunc am_aiter;
unaryfunc am_anext;
+ sendfunc am_send;
} PyAsyncMethods;
.. c:member:: unaryfunc PyAsyncMethods.am_await
@@ -2336,6 +2348,15 @@ Async Object Structures
Must return an :term:`awaitable` object. See :meth:`__anext__` for details.
This slot may be set to ``NULL``.
+.. c:member:: sendfunc PyAsyncMethods.am_send
+
+ The signature of this function is::
+
+ PySendResult am_send(PyObject *self, PyObject *arg, PyObject **result);
+
+ See :c:func:`PyIter_Send` for details.
+ This slot may be set to ``NULL``.
+
.. _slot-typedefs:
@@ -2431,6 +2452,10 @@ Slot Type typedefs
.. c:type:: PyObject *(*binaryfunc)(PyObject *, PyObject *)
+.. c:type:: PySendResult (*sendfunc)(PyObject *, PyObject *, PyObject **)
+
+ See :c:member:`~PyAsyncMethods.am_send`.
+
.. c:type:: PyObject *(*ternaryfunc)(PyObject *, PyObject *, PyObject *)
.. c:type:: PyObject *(*ssizeargfunc)(PyObject *, Py_ssize_t)
diff --git a/Doc/c-api/weakref.rst b/Doc/c-api/weakref.rst
index e3a9bda54d..9205ca620a 100644
--- a/Doc/c-api/weakref.rst
+++ b/Doc/c-api/weakref.rst
@@ -57,10 +57,10 @@ as much as it can.
.. note::
- This function returns a **borrowed reference** to the referenced object.
+ This function returns a :term:`borrowed reference` to the referenced object.
This means that you should always call :c:func:`Py_INCREF` on the object
- except if you know that it cannot be destroyed while you are still
- using it.
+ except when it cannot be destroyed before the last usage of the borrowed
+ reference.
.. c:function:: PyObject* PyWeakref_GET_OBJECT(PyObject *ref)