# Pengelolaan Versi API dan ABI

## Konstanta versi build-time

CPython memperlihatkan nomor versinya dalam makro berikut ini. Perhatikan bahwa ini sesuai dengan kode versi yang dibangun. Lihat `Py_Version` untuk versi yang digunakan pada saat run time.

Lihat Stabilitas API C untuk diskusi tentang stabilitas API dan ABI di seluruh versi.

PY_MAJOR_VERSION

  `3` di `3.4.1a2`.

PY_MINOR_VERSION

  `4` di `3.4.1a2`.

PY_MICRO_VERSION

  `1` di `3.4.1a2`.

PY_RELEASE_LEVEL

  `a` di `3.4.1a2`. Ini bisa berupa `0xA` untuk versi alfa, `0xB` untuk versi beta, `0xC` untuk kandidat rilis atau `0xF` untuk versi final.

PY_RELEASE_SERIAL

  `2` di `3.4.1a2`. Nol untuk rilis final.

PY_VERSION_HEX

  Nomor versi Python dikodekan dalam sebuah bilangan bulat. Lihat `Py_PACK_FULL_VERSION()` untuk mengetahui detail pengodean.

  Gunakan ini untuk perbandingan numerik, misalnya, `#if PY_VERSION_HEX >= ...`.

## Versi run-time

const unsigned long Py_Version
  Part of the Stable ABI since version 3.11.

  Nomor versi runtime Python yang dikodekan dalam sebuah bilangan bulat konstan. Lihat `Py_PACK_FULL_VERSION()` untuk detail pengodean. Ini berisi versi Python yang digunakan pada saat dijalankan.

  Gunakan ini untuk perbandingan numerik, misalnya, `if (Py_Version >= ...)`.

  Added in version 3.11.

## Makro pengemasan bit

uint32_t Py_PACK_FULL_VERSION(int major, int minor, int micro, int release_level, int release_serial)
  Part of the Stable ABI since version 3.14.

  Mengembalikan versi yang diberikan, dikodekan sebagai bilangan bulat 32-bit tunggal dengan struktur berikut:

  Argumen | Jumlah bit | Topeng bit | Pergeseran bit | Contoh nilai
  --- | --- | --- | --- | ---
  `3.4.1a2` | `3.10.0`
  major | 8 | `0xFF000000` | 24 | `0x03` | `0x03`
  minor | 8 | `0x00FF0000` | 16 | `0x04` | `0x0A`
  mikro | 8 | `0x0000FF00` | 8 | `0x01` | `0x00`
  release_level | 4 | `0x000000F0` | 4 | `0xA` | `0xF`
  release_serial | 4 | `0x0000000F` | 0 | `0x2` | `0x0`

  Sebagai contoh:

  Versi | argumen `Py_PACK_FULL_VERSION` | Versi yang dikodekan
  --- | --- | ---
  `3.4.1a2` | `(3, 4, 1, 0xA, 2)` | `0x030401a2`
  `3.10.0` | `(3, 10, 0, 0xF, 0)` | `0x030a00f0`

  Bit yang berada di luar jangkauan dalam argumen akan diabaikan. Artinya, makro dapat didefinisikan sebagai:

      #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` pada dasarnya adalah makro, yang dimaksudkan untuk digunakan dalam arahan `#if`, tetapi juga tersedia sebagai fungsi yang diekspor.

  Added in version 3.14.

uint32_t Py_PACK_VERSION(int major, int minor)
  Part of the Stable ABI since version 3.14.

  Setara dengan `Py_PACK_FULL_VERSION(major, minor, 0, 0, 0)`. Hasilnya tidak terikat dengan rilis Python apa pun, tetapi berguna dalam perbandingan numerik.

  Added in version 3.14.