# API i wersjonowanie ABI

## Stałe wersji czasu budowania

CPython udostępnia swój numer wersji w poniższych makrach. Należy pamiętać, że odpowiadają one wersji, z użyciem której kod został zbudowany. Zobacz :`Py_Version`, aby sprawdzić wersję używaną w czasie działania.

Więcej informacji na temat stabilności API i ABI w różnych wersjach można znaleźć na stronie C API Stability.

PY_MAJOR_VERSION

  `3` w `3.4.1a2`.

PY_MINOR_VERSION

  `4` w `3.4.1a2`.

PY_MICRO_VERSION

  `1` w `3.4.1a2`.

PY_RELEASE_LEVEL

  `a` w `3.4.1a2`. Może to być `0xA` dla wersji alfa, `0xB` dla wersji beta, `0xC` dla wersji kandydującej do wydania lub `0xF` dla wersji finalnej.

PY_RELEASE_SERIAL

  `2` w `3.4.1a2`. Zero dla ostatecznych wydań.

PY_VERSION_HEX

  Numer wersji Pythona zakodowany w pojedynczej liczbie całkowitej. Zobacz `Py_PACK_FULL_VERSION()`, aby poznać szczegóły kodowania.

  Używaj to do porównań liczbowych, na przykład `#if PY_VERSION_HEX >= ...`.

Te makra są zdefiniowane w Include/patchlevel.h

## Wersja środowiska uruchomieniowego

const unsigned long Py_Version
  Część stabilnego ABI od wersji 3.11.

  Numer wersji środowiska uruchomieniowego Pythona zakodowany w pojedynczej stałej całkowitoliczbowej. Zobacz `Py_PACK_FULL_VERSION()`, aby poznać szczegóły kodowania. Zawiera ona wersję Pythona używaną w czasie działania.

  Używaj to do porównań liczbowych, na przykład `if (Py_Version >= ...)`.

  Dodane w wersji 3.11.

## Makra pakowania bitowego

uint32_t Py_PACK_FULL_VERSION(int major, int minor, int micro, int release_level, int release_serial)
  Część stabilnego ABI od wersji 3.14.

  Zwraca podaną wersję, zakodowaną jako pojedyncza 32-bitowa liczba całkowita o następującej strukturze:

  Argument | Liczba bitów | Maska bitowa | Przesunięcie bitowe | Przykładowe wartości
  --- | --- | --- | --- | ---
  `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`

  Na przykład:

  Wersja | `Py_PACK_FULL_VERSION` argumenty | Zakodowana wersja
  --- | --- | ---
  `3.4.1a2` | `(3, 4, 1, 0xA, 2)` | `0x030401a2`
  `3.10.0` | `(3, 10, 0, 0xF, 0)` | `0x030a00f0`

  Bity spoza zakresu w argumentach są ignorowane. Oznacza to, że makro można zdefiniować następująco:

      #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``to przede wszystkim makro, przeznaczone do użycia w dyrektywach ``#if`, ale jest ono również dostępne jako wyeksportowana funkcja.

  Dodane w wersji 3.14.

uint32_t Py_PACK_VERSION(int major, int minor)
  Część stabilnego ABI od wersji 3.14.

  Równoważne `Py_PACK_FULL_VERSION(major, minor, 0, 0, 0)`. Wynik ten nie odpowiada żadnemu wydaniu Pythona, ale jest przydatny w porównaniach numerycznych.

  Dodane w wersji 3.14.