Back to Cpython

API and ABI Versioning

Doc/c-api/apiabiversion.rst

3.15.0a85.1 KB
Original Source

.. highlight:: c

.. _apiabiversion:


API and ABI Versioning


Build-time version constants

CPython exposes its version number in the following macros. Note that these correspond to the version code is built with. See :c:var:Py_Version for the version used at run time.

See :ref:stable for a discussion of API and ABI stability across versions.

.. c:macro:: PY_MAJOR_VERSION

The 3 in 3.4.1a2.

.. c:macro:: PY_MINOR_VERSION

The 4 in 3.4.1a2.

.. c:macro:: PY_MICRO_VERSION

The 1 in 3.4.1a2.

.. c:macro:: PY_RELEASE_LEVEL

The a in 3.4.1a2. This can be 0xA for alpha, 0xB for beta, 0xC for release candidate or 0xF for final.

.. c:namespace:: NULL .. c:macro:: PY_RELEASE_LEVEL_ALPHA :no-typesetting: .. c:macro:: PY_RELEASE_LEVEL_BETA :no-typesetting: .. c:macro:: PY_RELEASE_LEVEL_GAMMA :no-typesetting: .. c:macro:: PY_RELEASE_LEVEL_FINAL :no-typesetting:

For completeness, the values are available as macros: :c:macro:!PY_RELEASE_LEVEL_ALPHA (0xA), :c:macro:!PY_RELEASE_LEVEL_BETA (0xB), :c:macro:!PY_RELEASE_LEVEL_GAMMA (0xC), and :c:macro:!PY_RELEASE_LEVEL_FINAL (0xF).

.. c:macro:: PY_RELEASE_SERIAL

The 2 in 3.4.1a2. Zero for final releases.

.. c:macro:: PY_VERSION_HEX

The Python version number encoded in a single integer. See :c:func:Py_PACK_FULL_VERSION for the encoding details.

Use this for numeric comparisons, for example, #if PY_VERSION_HEX >= ....

.. c:macro:: PY_VERSION

The Python version as a string, for example, "3.4.1a2".

These macros are defined in :source:Include/patchlevel.h.

Run-time version

.. c:var:: const unsigned long Py_Version

The Python runtime version number encoded in a single constant integer. See :c:func:Py_PACK_FULL_VERSION for the encoding details. This contains the Python version used at run time.

Use this for numeric comparisons, for example, if (Py_Version >= ...).

.. versionadded:: 3.11

Bit-packing macros

.. c:function:: uint32_t Py_PACK_FULL_VERSION(int major, int minor, int micro, int release_level, int release_serial)

Return the given version, encoded as a single 32-bit integer with the following structure:

+------------------+-------+----------------+-----------+--------------------------+ | | No. | | | Example values | | | of | | +-------------+------------+ | Argument | bits | Bit mask | Bit shift | 3.4.1a2 | 3.10.0 | +==================+=======+================+===========+=============+============+ | major | 8 | 0xFF000000 | 24 | 0x03 | 0x03 | +------------------+-------+----------------+-----------+-------------+------------+ | minor | 8 | 0x00FF0000 | 16 | 0x04 | 0x0A | +------------------+-------+----------------+-----------+-------------+------------+ | micro | 8 | 0x0000FF00 | 8 | 0x01 | 0x00 | +------------------+-------+----------------+-----------+-------------+------------+ | release_level | 4 | 0x000000F0 | 4 | 0xA | 0xF | +------------------+-------+----------------+-----------+-------------+------------+ | release_serial | 4 | 0x0000000F | 0 | 0x2 | 0x0 | +------------------+-------+----------------+-----------+-------------+------------+

For example:

+-------------+------------------------------------+-----------------+ | Version | Py_PACK_FULL_VERSION arguments | Encoded version | +=============+====================================+=================+ | 3.4.1a2 | (3, 4, 1, 0xA, 2) | 0x030401a2 | +-------------+------------------------------------+-----------------+ | 3.10.0 | (3, 10, 0, 0xF, 0) | 0x030a00f0 | +-------------+------------------------------------+-----------------+

Out-of range bits in the arguments are ignored. That is, the macro can be defined as:

.. code-block:: c

  #ifndef Py_PACK_FULL_VERSION
  #define Py_PACK_FULL_VERSION(X, Y, Z, LEVEL, SERIAL) ( \
     (((X) & 0xff) << 24) |                              \
     (((Y) & 0xff) << 16) |                              \
     (((Z) & 0xff) << 8) |                               \
     (((LEVEL) & 0xf) << 4) |                            \
     (((SERIAL) & 0xf) << 0))
  #endif

Py_PACK_FULL_VERSION is primarily a macro, intended for use in #if directives, but it is also available as an exported function.

.. versionadded:: 3.14

.. c:function:: uint32_t Py_PACK_VERSION(int major, int minor)

Equivalent to Py_PACK_FULL_VERSION(major, minor, 0, 0, 0). The result does not correspond to any Python release, but is useful in numeric comparisons.

.. versionadded:: 3.14