Документация Python неофициальный перевод
Содержание страницы

Целочисленные объектыInteger Objects

Все целые числа реализованы как «длинные» целочисленные объекты произвольного размера.

При ошибке большинство API PyLong_As* возвращают (return type)-1, который невозможно отличить от числа. Используйте PyErr_Occurred() для устранения неоднозначности.

type PyLongObject
Часть Stable ABI (как непрозрачная структура).

Этот подтип PyObject представляет целочисленный объект Python.

PyTypeObject PyLong_Type
Часть Stable ABI.

Этот экземпляр PyTypeObject представляет целочисленный тип Python. Это тот же объект, что и int на уровне Python.

int PyLong_Check(PyObject *p)

Возвращает истину, если аргумент является PyLongObject или подтипом PyLongObject. Эта функция всегда завершается успешно.

int PyLong_CheckExact(PyObject *p)

Возвращает истину, если аргумент является PyLongObject, но не подтипом PyLongObject. Эта функция всегда завершается успешно.

PyObject *PyLong_FromLong(long v)
Возвращаемое значение: новая ссылка. Часть Stable ABI.

Возвращает новый объект PyLongObject из v или NULL при ошибке.

Деталь реализации CPython: CPython хранит массив целочисленных объектов для всех целых чисел в диапазоне от -5 до 1024. При создании int в этом диапазоне фактически возвращается ссылка на существующий объект.

PyObject *PyLong_FromUnsignedLong(unsigned long v)
Возвращаемое значение: новая ссылка. Часть Stable ABI.

Возвращает новый объект PyLongObject из C unsigned long или NULL при ошибке.

PyObject *PyLong_FromSsize_t(Py_ssize_t v)
Возвращаемое значение: новая ссылка. Часть Stable ABI.

Возвращает новый объект PyLongObject из C Py_ssize_t или NULL при ошибке.

PyObject *PyLong_FromSize_t(size_t v)
Возвращаемое значение: новая ссылка. Часть Stable ABI.

Возвращает новый объект PyLongObject из C size_t или NULL при ошибке.

PyObject *PyLong_FromLongLong(long long v)
Возвращаемое значение: новая ссылка. Часть Stable ABI.

Возвращает новый объект PyLongObject из C long long или NULL при ошибке.

PyObject *PyLong_FromUnsignedLongLong(unsigned long long v)
Возвращаемое значение: новая ссылка. Часть Stable ABI.

Возвращает новый объект PyLongObject из C unsigned long long или NULL при ошибке.

PyObject *PyLong_FromInt32(int32_t value)
PyObject *PyLong_FromInt64(int64_t value)
Часть Stable ABI начиная с версии 3.14.

Возвращает новый объект PyLongObject из знакового C int32_t или int64_t, или NULL с установленным исключением при ошибке.

Добавлено в версии 3.14.

PyObject *PyLong_FromUInt32(uint32_t value)
PyObject *PyLong_FromUInt64(uint64_t value)
Часть Stable ABI начиная с версии 3.14.

Возвращает новый объект PyLongObject из беззнакового C uint32_t или uint64_t, или NULL с установленным исключением при ошибке.

Добавлено в версии 3.14.

PyObject *PyLong_FromDouble(double v)
Возвращаемое значение: новая ссылка. Часть Stable ABI.

Возвращает новый объект PyLongObject из целой части v или NULL в случае ошибки.

PyObject *PyLong_FromString(const char *str, char **pend, int base)
Возвращаемое значение: новая ссылка. Часть Stable ABI.

Возвращает новый PyLongObject на основе строкового значения str, которое интерпретируется в соответствии с основанием base, или NULL в случае ошибки. Если pend не NULL, то *pend будет указывать на конец str в случае успеха или на первый символ, который не удалось обработать, в случае ошибки. Если base равно 0, то str интерпретируется в соответствии с определением Integer literals; в этом случае ведущие нули в ненулевом десятичном числе вызывают ValueError. Если base не равно 0, оно должно быть между 2 и 36 включительно. Начальные и конечные пробелы, а также одиночные символы подчёркивания после спецификатора основания и между цифрами игнорируются. Если цифр нет или str не завершается нулевым символом после цифр и конечных пробелов, будет вызвано ValueError.

См. также

Функции PyLong_AsNativeBytes() и PyLong_FromNativeBytes() можно использовать для преобразования PyLongObject в массив байтов и обратно в системе счисления 256.

PyObject *PyLong_FromUnicodeObject(PyObject *u, int base)
Возвращаемое значение: новая ссылка.

Преобразует последовательность цифр Unicode в строке u в целое число Python.

Добавлено в версии 3.3.

PyObject *PyLong_FromVoidPtr(void *p)
Возвращаемое значение: новая ссылка. Часть Stable ABI.

Создаёт целое число Python из указателя p. Значение указателя можно извлечь из полученного значения с помощью PyLong_AsVoidPtr().

PyObject *PyLong_FromNativeBytes(const void *buffer, size_t n_bytes, int flags)
Часть Stable ABI начиная с версии 3.14.

Создаёт целое число Python из значения, содержащегося в первых n_bytes буфера buffer, интерпретируемого как знаковое число в дополнительном коде.

flags – как для PyLong_AsNativeBytes(). Передача -1 выберет нативный порядок байтов, используемый CPython, и будет считать, что старший бит является знаковым. Передача Py_ASNATIVEBYTES_UNSIGNED_BUFFER даёт тот же результат, что и вызов PyLong_FromUnsignedNativeBytes(). Остальные флаги игнорируются.

Добавлено в версии 3.13.

PyObject *PyLong_FromUnsignedNativeBytes(const void *buffer, size_t n_bytes, int flags)
Часть Stable ABI начиная с версии 3.14.

Создаёт целое число Python из значения, содержащегося в первых n_bytes буфера buffer, интерпретируемого как беззнаковое число.

flags – как для PyLong_AsNativeBytes(). Передача -1 выберет нативный порядок байтов, используемый CPython, и будет считать, что старший бит не является знаковым. Флаги, не связанные с порядком байтов, игнорируются.

Добавлено в версии 3.13.

PyLong_FromPid(pid)

Макрос для создания целого числа Python из идентификатора процесса.

Может быть определён как псевдоним PyLong_FromLong() или PyLong_FromLongLong() в зависимости от размера типа PID в системе.

Добавлено в версии 3.2.

long PyLong_AsLong(PyObject *obj)
Часть Stable ABI.

Возвращает представление на C long для obj. Если obj не является экземпляром PyLongObject, сначала вызывается его метод __index__() (если он присутствует) для преобразования в PyLongObject.

Вызывает OverflowError, если значение obj выходит за пределы допустимого диапазона для long.

При ошибке возвращает -1. Используйте PyErr_Occurred() для разрешения неоднозначности.

Изменено в версии 3.8: Используйте __index__(), если доступно.

Изменено в версии 3.10: Эта функция больше не использует __int__().

long PyLong_AS_LONG(PyObject *obj)

Полностью эквивалентна предпочтительной PyLong_AsLong. В частности, может завершиться ошибкой с OverflowError или другим исключением.

Soft deprecated since version 3.14.

int PyLong_AsInt(PyObject *obj)
Часть Stable ABI, начиная с версии 3.13.

Аналогична PyLong_AsLong(), но сохраняет результат в C int вместо C long.

Добавлено в версии 3.13.

long PyLong_AsLongAndOverflow(PyObject *obj, int *overflow)
Часть Stable ABI.

Возвращает представление на C long для obj. Если obj не является экземпляром PyLongObject, сначала вызывается его метод __index__() (если он присутствует) для преобразования в PyLongObject.

Если значение obj больше LONG_MAX или меньше LONG_MIN, установите *overflow в 1 или -1 соответственно и верните -1; в противном случае установите *overflow в 0. Если возникает любое другое исключение, установите *overflow в 0 и верните -1 как обычно.

При ошибке возвращает -1. Используйте PyErr_Occurred() для разрешения неоднозначности.

Изменено в версии 3.8: Используйте __index__(), если доступно.

Изменено в версии 3.10: Эта функция больше не использует __int__().

long long PyLong_AsLongLong(PyObject *obj)
Часть Stable ABI.

Возвращает C-представление long long объекта obj. Если obj не является экземпляром PyLongObject, сначала вызывается его метод __index__() (если он есть) для преобразования в PyLongObject.

Вызывает OverflowError, если значение obj выходит за пределы допустимого диапазона для long long.

При ошибке возвращает -1. Используйте PyErr_Occurred() для разрешения неоднозначности.

Изменено в версии 3.8: Используйте __index__(), если доступно.

Изменено в версии 3.10: Эта функция больше не использует __int__().

long long PyLong_AsLongLongAndOverflow(PyObject *obj, int *overflow)
Часть Stable ABI.

Возвращает C-представление long long объекта obj. Если obj не является экземпляром PyLongObject, сначала вызывается его метод __index__() (если он есть) для преобразования в PyLongObject.

Если значение obj больше LLONG_MAX или меньше LLONG_MIN, устанавливает *overflow в 1 или -1 соответственно и возвращает -1; в противном случае устанавливает *overflow в 0. Если возникает любое другое исключение, устанавливает *overflow в 0 и возвращает -1 как обычно.

При ошибке возвращает -1. Используйте PyErr_Occurred() для разрешения неоднозначности.

Добавлено в версии 3.2.

Изменено в версии 3.8: Используйте __index__(), если доступно.

Изменено в версии 3.10: Эта функция больше не использует __int__().

Py_ssize_t PyLong_AsSsize_t(PyObject *pylong)
Часть Stable ABI.

Возвращает C-представление Py_ssize_t объекта pylong. pylong должен быть экземпляром PyLongObject.

Вызывает OverflowError, если значение pylong выходит за пределы диапазона для Py_ssize_t.

При ошибке возвращает -1. Используйте PyErr_Occurred() для разрешения неоднозначности.

unsigned long PyLong_AsUnsignedLong(PyObject *pylong)
Часть Stable ABI.

Возвращает C-представление unsigned long объекта pylong. pylong должен быть экземпляром PyLongObject.

Вызывает OverflowError, если значение pylong выходит за пределы диапазона для unsigned long.

Возвращает (unsigned long)-1 в случае ошибки. Для устранения неоднозначности используйте PyErr_Occurred().

size_t PyLong_AsSize_t(PyObject *pylong)
Часть Stable ABI.

Возвращает C-представление size_t объекта pylong. pylong должен быть экземпляром PyLongObject.

Вызывает OverflowError, если значение pylong выходит за пределы диапазона для size_t.

Возвращает (size_t)-1 в случае ошибки. Для устранения неоднозначности используйте PyErr_Occurred().

unsigned long long PyLong_AsUnsignedLongLong(PyObject *pylong)
Часть Stable ABI.

Возвращает C-представление unsigned long long объекта pylong. pylong должен быть экземпляром PyLongObject.

Вызывает OverflowError, если значение pylong выходит за пределы диапазона для unsigned long long.

Возвращает (unsigned long long)-1 в случае ошибки. Для устранения неоднозначности используйте PyErr_Occurred().

Изменено в версии 3.1: Отрицательное значение pylong теперь вызывает OverflowError, а не TypeError.

unsigned long PyLong_AsUnsignedLongMask(PyObject *obj)
Часть Stable ABI.

Возвращает C-представление unsigned long объекта obj. Если obj не является экземпляром PyLongObject, сначала вызывается его метод __index__() (если он есть) для преобразования в PyLongObject.

Если значение obj выходит за пределы диапазона для unsigned long, возвращается приведение этого значения по модулю ULONG_MAX + 1.

При ошибке возвращает (unsigned long)-1. Используйте PyErr_Occurred() для разрешения неоднозначности.

Изменено в версии 3.8: Используйте __index__(), если доступно.

Изменено в версии 3.10: Эта функция больше не использует __int__().

unsigned long long PyLong_AsUnsignedLongLongMask(PyObject *obj)
Часть Stable ABI.

Возвращает представление unsigned long long на языке C для obj. Если obj не является экземпляром PyLongObject, сначала вызывается его метод __index__() (если он есть) для преобразования в PyLongObject.

Если значение obj выходит за пределы диапазона для unsigned long long, возвращается приведение этого значения по модулю ULLONG_MAX + 1.

При ошибке возвращает (unsigned long long)-1. Используйте PyErr_Occurred() для разрешения неоднозначности.

Изменено в версии 3.8: Используйте __index__(), если доступно.

Изменено в версии 3.10: Эта функция больше не использует __int__().

int PyLong_AsInt32(PyObject *obj, int32_t *value)
int PyLong_AsInt64(PyObject *obj, int64_t *value)
Часть Stable ABI начиная с версии 3.14.

Присваивает *value знаковое представление int32_t или int64_t на языке C для obj.

Если obj не является экземпляром PyLongObject, сначала вызывается его метод __index__() (если он есть) для преобразования в PyLongObject.

Если значение obj выходит за пределы диапазона, возбуждается исключение OverflowError.

Присваивает значение *value и возвращает 0 при успехе. Возбуждает исключение и возвращает -1 при ошибке.

value не должен быть NULL.

Добавлено в версии 3.14.

int PyLong_AsUInt32(PyObject *obj, uint32_t *value)
int PyLong_AsUInt64(PyObject *obj, uint64_t *value)
Часть Stable ABI начиная с версии 3.14.

Присваивает *value беззнаковое представление uint32_t или uint64_t на языке C для obj.

Если obj не является экземпляром PyLongObject, сначала вызывается его метод __index__() (если он есть) для преобразования в PyLongObject.

  • Если obj отрицательное, возбуждается исключение ValueError.

  • Если значение obj выходит за пределы диапазона, возбуждается исключение OverflowError.

Присваивает значение *value и возвращает 0 при успехе. Возбуждает исключение и возвращает -1 при ошибке.

value не должен быть NULL.

Добавлено в версии 3.14.

double PyLong_AsDouble(PyObject *pylong)
Часть Stable ABI.

Возвращает представление double на языке C для pylong. pylong должен быть экземпляром PyLongObject.

Возбуждает исключение OverflowError, если значение pylong выходит за пределы диапазона для double.

При ошибке возвращает -1.0. Используйте PyErr_Occurred() для разрешения неоднозначности.

void *PyLong_AsVoidPtr(PyObject *pylong)
Часть Stable ABI.

Преобразует целое число Python pylong в указатель void на языке C. Если pylong не удаётся преобразовать, возбуждается исключение OverflowError. Это гарантирует, что полученный указатель void будет пригоден для использования только для значений, созданных с помощью PyLong_FromVoidPtr().

При ошибке возвращает NULL. Используйте PyErr_Occurred() для разрешения неоднозначности.

Py_ssize_t PyLong_AsNativeBytes(PyObject *pylong, void *buffer, Py_ssize_t n_bytes, int flags)
Часть Stable ABI начиная с версии 3.14.

Копирует значение целого числа Python pylong в нативный buffer размера n_bytes. Флаг flags можно установить в -1 для поведения, аналогичного приведению в C, или в значения, описанные ниже, для управления поведением.

Возвращает -1 с возбуждением исключения при ошибке. Это может произойти, если pylong не удаётся интерпретировать как целое число, или если pylong было отрицательным и был установлен флаг Py_ASNATIVEBYTES_REJECT_NEGATIVE.

В противном случае возвращает количество байт, необходимое для хранения значения. Если оно меньше или равно n_bytes, значение было скопировано целиком. Заполняются все n_bytes буфера: оставшиеся байты заполняются копиями знакового бита.

Если возвращённое значение больше n_bytes, значение было усечено: записывается столько младших битов значения, сколько помещается, а старшие биты игнорируются. Это соответствует типичному поведению нисходящего приведения в стиле C.

Примечание

Переполнение не считается ошибкой. Если возвращённое значение больше n_bytes, старшие биты были отброшены.

0 никогда не будет возвращён.

Значения всегда копируются в дополнительном коде.

Пример использования:

int32_t value;
Py_ssize_t bytes = PyLong_AsNativeBytes(pylong, &value, sizeof(value), -1);
if (bytes < 0) {
    // Не удалось. Установлено исключение Python с указанием причины.
    return NULL;
}
else if (bytes <= (Py_ssize_t)sizeof(value)) {
    // Успешно!
}
else {
    // Произошло переполнение, но 'value' содержит усечённые
    // младшие биты pylong.
}

Передача нуля в n_bytes возвращает размер буфера, которого будет достаточно для хранения значения. Он может быть больше, чем технически необходимо, но не чрезмерно. Если n_bytes=0, buffer может быть NULL.

Примечание

Передача n_bytes=0 в эту функцию не является надёжным способом определения битовой длины значения.

Чтобы получить всё значение Python неизвестного размера, функцию можно вызвать дважды: сначала для определения размера буфера, затем для его заполнения:

// Запрос необходимого объёма памяти.
Py_ssize_t expected = PyLong_AsNativeBytes(pylong, NULL, 0, -1);
if (expected < 0) {
    // Не удалось. Установлено исключение Python с указанием причины.
    return NULL;
}
assert(expected != 0);  // Невозможно согласно определению API.
uint8_t *bignum = malloc(expected);
if (!bignum) {
    PyErr_SetString(PyExc_MemoryError, "bignum malloc failed.");
    return NULL;
}
// Безопасно получить всё значение.
Py_ssize_t bytes = PyLong_AsNativeBytes(pylong, bignum, expected, -1);
if (bytes < 0) {  // Установлено исключение.
    free(bignum);
    return NULL;
}
else if (bytes > expected) {  // Этого не должно быть возможно.
    PyErr_SetString(PyExc_RuntimeError,
        "Unexpected bignum truncation after a size check.");
    free(bignum);
    return NULL;
}
// Ожидаемый успех с учётом предварительной проверки выше.
// ... использовать bignum ...
free(bignum);

flags может быть либо -1 (Py_ASNATIVEBYTES_DEFAULTS) для выбора значений по умолчанию, поведение которых наиболее похоже на приведение C, либо комбинацией других флагов из таблицы ниже. Обратите внимание, что -1 нельзя комбинировать с другими флагами.

В настоящее время -1 соответствует Py_ASNATIVEBYTES_NATIVE_ENDIAN | Py_ASNATIVEBYTES_UNSIGNED_BUFFER.

Флаг

Значение

Py_ASNATIVEBYTES_DEFAULTS
Часть Stable ABI начиная с версии 3.14.

-1

Py_ASNATIVEBYTES_BIG_ENDIAN
Часть Stable ABI начиная с версии 3.14.

0

Py_ASNATIVEBYTES_LITTLE_ENDIAN
Часть Stable ABI начиная с версии 3.14.

1

Py_ASNATIVEBYTES_NATIVE_ENDIAN
Часть Stable ABI начиная с версии 3.14.

3

Py_ASNATIVEBYTES_UNSIGNED_BUFFER
Часть Stable ABI начиная с версии 3.14.

4

Py_ASNATIVEBYTES_REJECT_NEGATIVE
Часть Stable ABI начиная с версии 3.14.

8

Py_ASNATIVEBYTES_ALLOW_INDEX
Часть Stable ABI начиная с версии 3.14.

16

Указание Py_ASNATIVEBYTES_NATIVE_ENDIAN переопределяет любые другие флаги порядка байтов. Передача 2 зарезервирована.

По умолчанию будет запрошен буфер достаточного размера для включения знакового бита. Например, при преобразовании 128 с n_bytes=1 функция вернёт 2 (или больше), чтобы сохранить нулевой знаковый бит.

Если указан Py_ASNATIVEBYTES_UNSIGNED_BUFFER, нулевой знаковый бит будет опущен при расчёте размера. Это позволяет, например, 128 поместиться в однобайтовый буфер. Если впоследствии целевой буфер будет трактоваться как знаковый, положительное входное значение может стать отрицательным. Обратите внимание, что флаг не влияет на обработку отрицательных значений: для них всегда запрашивается место под знаковый бит.

Указание Py_ASNATIVEBYTES_REJECT_NEGATIVE приводит к установке исключения, если pylong отрицательно. Без этого флага отрицательные значения будут копироваться при условии, что достаточно места хотя бы для одного знакового бита, независимо от того, было ли указано Py_ASNATIVEBYTES_UNSIGNED_BUFFER.

Если указан Py_ASNATIVEBYTES_ALLOW_INDEX и передано нецелое значение, сначала будет вызван его метод __index__(). Это может привести к выполнению кода Python и возможности выполнения других потоков, что может вызвать изменения других объектов или используемых значений. Когда flags равно -1, эта опция не установлена, и нецелые значения вызовут TypeError.

Примечание

С флагами по умолчанию flags (-1, или UNSIGNED_BUFFER без REJECT_NEGATIVE) несколько целых чисел Python могут отображаться на одно значение без переполнения. Например, и 255, и -1 помещаются в однобайтовый буфер и устанавливают все его биты. Это соответствует типичному поведению приведения в C.

Добавлено в версии 3.13.

PyLong_AsPid(pid)

Макрос для преобразования целого числа Python в идентификатор процесса.

Он может быть определён как псевдоним для PyLong_AsLong(), PyLong_FromLongLong() или PyLong_AsInt() в зависимости от размера типа PID в системе.

Добавлено в версии 3.2.

int PyLong_GetSign(PyObject *obj, int *sign)

Получить знак целочисленного объекта obj.

В случае успеха присвоить *sign знак целого числа (0, -1 или +1 для нуля, отрицательного или положительного числа соответственно) и вернуть 0.

В случае ошибки вернуть -1 с установленным исключением. Эта функция всегда завершается успешно, если obj является PyLongObject или его подтипом.

Добавлено в версии 3.14.

int PyLong_IsPositive(PyObject *obj)

Проверить, является ли целочисленный объект obj положительным (obj > 0).

Если obj является экземпляром PyLongObject или его подтипа, вернуть 1, если он положительный, и 0 в противном случае. Иначе установить исключение и вернуть -1.

Добавлено в версии 3.14.

int PyLong_IsNegative(PyObject *obj)

Проверить, является ли целочисленный объект obj отрицательным (obj < 0).

Если obj является экземпляром PyLongObject или его подтипа, вернуть 1, если он отрицательный, и 0 в противном случае. Иначе установить исключение и вернуть -1.

Добавлено в версии 3.14.

int PyLong_IsZero(PyObject *obj)

Проверить, является ли целочисленный объект obj нулём.

Если obj является экземпляром PyLongObject или его подтипа, вернуть 1, если он равен нулю, и 0 в противном случае. Иначе установить исключение и вернуть -1.

Добавлено в версии 3.14.

PyObject *PyLong_GetInfo(void)
Часть Stable ABI.

В случае успеха возвращает доступный только для чтения именованный кортеж, содержащий информацию о внутреннем представлении целых чисел в Python. Описание отдельных полей см. в sys.int_info.

При ошибке возвращает NULL с установленным исключением.

Добавлено в версии 3.1.

int PyUnstable_Long_IsCompact(const PyLongObject *op)
Это нестабильное API. Оно может меняться без предупреждения в минорных версиях.

Возвращает 1, если op компактный, и 0 в противном случае.

Эта функция позволяет критичному к производительности коду реализовать «быстрый путь» для малых целых чисел. Для компактных значений используйте PyUnstable_Long_CompactValue(); для остальных используйте PyLong_As* или PyLong_AsNativeBytes().

Ожидается, что ускорение будет незначительным для большинства пользователей.

Какие именно значения считаются компактными, является деталью реализации и может измениться.

Добавлено в версии 3.12.

Py_ssize_t PyUnstable_Long_CompactValue(const PyLongObject *op)
Это нестабильное API. Оно может меняться без предупреждения в минорных версиях.

Если op компактный, как определено с помощью PyUnstable_Long_IsCompact(), вернуть его значение.

В противном случае возвращаемое значение не определено.

Добавлено в версии 3.12.

Экспорт APIExport API

Добавлено в версии 3.14.

type PyLongLayout
Часть Stable ABI (включая все члены) начиная с версии 3.15.

Макет массива «цифр» («лимпов» в терминологии GMP), используемый для представления абсолютного значения целых чисел произвольной точности.

Используйте PyLong_GetNativeLayout(), чтобы получить собственный макет объектов int Python, которые внутри используются для целых чисел с «достаточно большим» абсолютным значением.

См. также sys.int_info, который предоставляет аналогичную информацию в Python.

uint8_t bits_per_digit

Количество битов на цифру. Например, 15-битная цифра означает, что биты 0-14 содержат значимую информацию.

uint8_t digit_size

Размер цифры в байтах. Например, для 15-битной цифры потребуется не менее 2 байт.

int8_t digits_order

Порядок цифр:

  • 1 – сначала старшая цифра

  • -1 – сначала младшая цифра

int8_t digit_endianness

Порядок байтов в цифре:

  • 1 – сначала старший байт (big endian)

  • -1 – сначала младший байт (little endian)

const PyLongLayout *PyLong_GetNativeLayout(void)
Часть Stable ABI начиная с версии 3.15.

Получает собственный макет объектов int Python.

См. структуру PyLongLayout.

Функцию нельзя вызывать до инициализации Python или после финализации Python. Возвращаемый макет действителен до завершения Python. Макет одинаков для всех под-интерпретаторов Python в процессе, поэтому его можно кэшировать.

type PyLongExport
Часть Stable ABI (включая все члены) начиная с версии 3.15.

Экспорт объекта int Python.

Есть два случая:

  • Если digits равно NULL, используйте только поле value.

  • Если digits не равно NULL, используйте поля negative, ndigits и digits.

int64_t value

Собственное целочисленное значение экспортируемого объекта int. Допустимо только если digits равно NULL.

uint8_t negative

1 если число отрицательное, 0 в противном случае. Допустимо только если digits не равно NULL.

Py_ssize_t ndigits

Количество цифр в массиве digits. Допустимо только если digits не равно NULL.

const void *digits

Массив беззнаковых разрядов, доступный только для чтения. Может быть NULL.

int PyLong_Export(PyObject *obj, PyLongExport *export_long)
Часть Stable ABI начиная с версии 3.15.

Экспортирует объект Python int.

export_long должен указывать на структуру PyLongExport, выделенную вызывающим. Он не должен быть NULL.

При успехе заполняет *export_long и возвращает 0. При ошибке устанавливает исключение и возвращает -1.

PyLong_FreeExport() должен вызываться, когда экспорт больше не нужен.

Деталь реализации CPython: Эта функция всегда завершается успешно, если obj является объектом Python int или его подклассом.

void PyLong_FreeExport(PyLongExport *export_long)
Часть Stable ABI начиная с версии 3.15.

Освобождает экспорт export_long, созданный PyLong_Export().

Деталь реализации CPython: Вызов PyLong_FreeExport() необязателен, если export_long->digits равен NULL.

PyLongWriter API

API PyLongWriter можно использовать для импорта целого числа.

Добавлено в версии 3.14.

type PyLongWriter
Часть Stable ABI (как непрозрачная структура) начиная с версии 3.15.

Экземпляр писателя Python int.

Экземпляр должен быть уничтожен с помощью PyLongWriter_Finish() или PyLongWriter_Discard().

PyLongWriter *PyLongWriter_Create(int negative, Py_ssize_t ndigits, void **digits)
Часть Stable ABI начиная с версии 3.15.

Создаёт PyLongWriter.

При успехе выделяет *digits и возвращает писатель. При ошибке устанавливает исключение и возвращает NULL.

negative равен 1, если число отрицательное, или 0 в противном случае.

ndigits – количество разрядов в массиве digits. Оно должно быть больше 0.

digits не должен быть NULL.

После успешного вызова этой функции вызывающий должен заполнить массив разрядов digits, а затем вызвать PyLongWriter_Finish(), чтобы получить объект Python int. Расположение digits описано в PyLong_GetNativeLayout().

Разряды должны находиться в диапазоне [0; (1 << bits_per_digit) - 1] (где bits_per_digit – количество бит на разряд). Любые неиспользуемые старшие разряды должны быть установлены в 0.

В качестве альтернативы можно вызвать PyLongWriter_Discard() для уничтожения экземпляра писателя без создания объекта int.

PyObject *PyLongWriter_Finish(PyLongWriter *writer)
Возвращаемое значение: новая ссылка. Часть Stable ABI начиная с версии 3.15.

Завершает PyLongWriter, созданный PyLongWriter_Create().

При успехе возвращает объект Python int. При ошибке устанавливает исключение и возвращает NULL.

Функция заботится о нормализации разрядов и при необходимости преобразует объект в компактное целое число.

Экземпляр писателя и массив digits становятся недействительными после вызова.

void PyLongWriter_Discard(PyLongWriter *writer)
Часть Stable ABI начиная с версии 3.15.

Отменяет объект PyLongWriter, созданный с помощью PyLongWriter_Create().

Если writer равен NULL, операция не выполняется.

Экземпляр писателя и массив digits становятся недействительными после вызова.

Устаревший APIDeprecated API

Эти макросы мягко устарели. Они описывают параметры внутреннего представления экземпляров PyLongObject.

Используйте PyLong_GetNativeLayout() вместе с PyLong_Export() для чтения целочисленных данных или PyLongWriter для их записи. В настоящее время они используют одну и ту же разметку, но спроектированы так, чтобы продолжать корректно работать, даже если внутреннее представление целых чисел в CPython изменится.

PyLong_SHIFT

Это эквивалентно bits_per_digit в выводе PyLong_GetNativeLayout().

PyLong_BASE

В настоящее время это эквивалентно 1 << PyLong_SHIFT.

PyLong_MASK

В настоящее время это эквивалентно (1 << PyLong_SHIFT) - 1