Spaces:
Running on Zero
Running on Zero
File size: 4,435 Bytes
9273228 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | # API and ABI Versioning {#apiabiversion}
## 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 `Py_Version`{.interpreted-text role="c:var"} for the version used at **run time**.
See `stable`{.interpreted-text role="ref"} for a discussion of API and ABI stability across versions.
> The `3` in `3.4.1a2`.
> The `4` in `3.4.1a2`.
> The `1` in `3.4.1a2`.
> The `a` in `3.4.1a2`. This can be `0xA` for alpha, `0xB` for beta, `0xC` for release candidate or `0xF` for final.
>
> For completeness, the values are available as macros: `!PY_RELEASE_LEVEL_ALPHA`{.interpreted-text role="c:macro"} (`0xA`), `!PY_RELEASE_LEVEL_BETA`{.interpreted-text role="c:macro"} (`0xB`), `!PY_RELEASE_LEVEL_GAMMA`{.interpreted-text role="c:macro"} (`0xC`), and `!PY_RELEASE_LEVEL_FINAL`{.interpreted-text role="c:macro"} (`0xF`).
> The `2` in `3.4.1a2`. Zero for final releases.
> The Python version number encoded in a single integer. See `Py_PACK_FULL_VERSION`{.interpreted-text role="c:func"} for the encoding details.
>
> Use this for numeric comparisons, for example, `#if PY_VERSION_HEX >= ...`.
> The Python version as a string, for example, `"3.4.1a2"`.
These macros are defined in `Include/patchlevel.h`{.interpreted-text role="source"}.
## Run-time version
> The Python runtime version number encoded in a single constant integer. See `Py_PACK_FULL_VERSION`{.interpreted-text role="c:func"} 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
> Return the given version, encoded as a single 32-bit integer with the following structure:
>
> +------------------+-------------+--------------+-----------+-------------------------+
> | Argument | No. of bits | Bit mask | Bit shift | Example values |
> | | | | +------------+------------+
> | | | | | `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:
>
> ``` 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
> :::
> 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
> :::
|