Целочисленные объекты
Все целые числа реализованы как объекты «long» произвольного размера.
В случае ошибки большинство API PyLong_As* возвращают (return type)-1, которое невозможно отличить от числа. Используйте PyErr_Occurred(), чтобы устранить неоднозначность.
-
type PyLongObject -
Часть ограниченного API (в виде непрозрачной структуры).
Этот подтип
PyObjectпредставляет целочисленный объект Python.
-
PyTypeObject PyLong_Type -
Часть стабильного ABI.
Этот экземпляр
PyTypeObjectпредставляет целочисленный тип Python. Это тот же объект, что иintна уровне Python.
-
int PyLong_Check(PyObject *p) -
Возвращает true, если аргумент является
PyLongObjectили подтипомPyLongObject. Эта функция всегда завершается успешно.
-
int PyLong_CheckExact(PyObject *p) -
Возвращает true, если аргумент является
PyLongObject, но не подтипомPyLongObject. Эта функция всегда завершается успешно.
-
PyObject *PyLong_FromLong(long v) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Возвращает новый объект
PyLongObjectиз v илиNULLв случае сбоя.Особенность реализации CPython: CPython хранит массив целочисленных объектов для всех целых чисел от
-5до256. При создании int в этом диапазоне вы фактически получаете ссылку на уже существующий объект.
-
PyObject *PyLong_FromUnsignedLong(unsigned long v) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Возвращает новый объект
PyLongObjectиз значения C-типа unsigned long илиNULLв случае сбоя.
-
PyObject *PyLong_FromSsize_t(Py_ssize_t v) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Возвращает новый объект
PyLongObjectиз значения C-типаPy_ssize_tилиNULLв случае сбоя.
-
PyObject *PyLong_FromSize_t(size_t v) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Возвращает новый объект
PyLongObjectиз значения C-типаsize_tилиNULLв случае сбоя.
-
PyObject *PyLong_FromLongLong(long long v) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Возвращает новый объект
PyLongObjectиз значения C-типа long long илиNULLв случае сбоя.
-
PyObject *PyLong_FromUnsignedLongLong(unsigned long long v) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Возвращает новый объект
PyLongObjectиз значения C-типа unsigned long long илиNULLв случае сбоя.
-
PyObject *PyLong_FromInt32(int32_t value) -
PyObject *PyLong_FromInt64(int64_t value) -
Часть стабильного ABI начиная с версии 3.14.
Возвращает новый объект
PyLongObjectиз знакового значения C-типа int32_t или int64_t либоNULLс установленным исключением в случае сбоя.Добавлено в версии 3.14.
-
PyObject *PyLong_FromUInt32(uint32_t value) -
PyObject *PyLong_FromUInt64(uint64_t value) -
Часть стабильного ABI начиная с версии 3.14.
Возвращает новый объект
PyLongObjectиз беззнакового значения C-типа uint32_t или uint64_t либоNULLс установленным исключением в случае сбоя.Добавлено в версии 3.14.
-
PyObject *PyLong_FromDouble(double v) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Возвращает новый объект
PyLongObjectиз целой части v илиNULLв случае сбоя.
-
PyObject *PyLong_FromString(const char *str, char **pend, int base) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Возвращает новый объект
PyLongObjectна основе строкового значения в str, интерпретируемого в соответствии с основанием системы счисления base, илиNULLв случае сбоя. Если pend не равенNULL, то при успешном выполнении *pend будет указывать на конец str, а в случае ошибки — на первый символ, который не удалось обработать. Если base равен0, str интерпретируется согласно определению целочисленных литералов; в этом случае ведущие нули в ненулевом десятичном числе вызывают исключениеValueError. Если base не равен0, он должен находиться в диапазоне от2до36включительно. Начальные и конечные пробелы, а также одиночные символы подчёркивания после указания основания и между цифрами игнорируются. Если цифр нет или после цифр и конечных пробелов строка str не завершается нулевым символом, будет вызвано исключениеValueError.См. также
Функции
PyLong_AsNativeBytes()иPyLong_FromNativeBytes()можно использовать для преобразованияPyLongObjectв массив байтов с основанием256и обратно.
-
PyObject *PyLong_FromUnicodeObject(PyObject *u, int base) -
Возвращаемое значение: новая ссылка.
Преобразует последовательность цифр Юникода в строке u в целочисленное значение Python.
Добавлено в версии 3.3.
-
PyObject *PyLong_FromVoidPtr(void *p) -
Возвращаемое значение: новая ссылка. Часть стабильного ABI.
Создаёт целое число Python из указателя p. Значение указателя можно получить из результирующего значения с помощью
PyLong_AsVoidPtr().
-
PyObject *PyLong_FromNativeBytes(const void *buffer, size_t n_bytes, int flags) -
Часть стабильного 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) -
Часть стабильного ABI начиная с версии 3.14.
Создаёт целое число Python из значения, содержащегося в первых n_bytes байтах buffer, интерпретируя его как беззнаковое число.
Аргумент flags используется так же, как в
PyLong_AsNativeBytes(). Передача-1выбирает порядок байтов, используемый платформой, для которой был скомпилирован CPython, и предполагает, что старший бит не является знаковым. Все флаги, кроме задающих порядок байтов, игнорируются.Добавлено в версии 3.13.
-
PyLong_FromPid(pid) -
Макрос для создания целого числа Python из идентификатора процесса.
В зависимости от размера системного типа PID этот макрос может быть определён как псевдоним
PyLong_FromLong()илиPyLong_FromLongLong().Добавлено в версии 3.2.
-
long PyLong_AsLong(PyObject *obj) -
Часть стабильного ABI.
Возвращает представление obj в виде значения C-типа long. Если 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или другим исключением.Условно устарел начиная с версии 3.14.
-
-
int PyLong_AsInt(PyObject *obj) -
Часть стабильного ABI начиная с версии 3.13.
Аналогична
PyLong_AsLong(), но сохраняет результат в C-типе int, а не в C-типе long.Добавлено в версии 3.13.
-
long PyLong_AsLongAndOverflow(PyObject *obj, int *overflow) -
Часть стабильного ABI.
Возвращает представление obj в виде значения C-типа long. Если 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) -
Часть стабильного ABI.
Возвращает представление obj в виде значения C-типа long long. Если 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) -
Часть стабильного ABI.
Возвращает представление obj в виде значения C-типа long long. Если 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) -
Часть стабильного ABI.
Возвращает представление pylong в виде значения C-типа
Py_ssize_t. pylong должен быть экземпляромPyLongObject.Вызывает исключение
OverflowError, если значение pylong выходит за допустимый диапазон дляPy_ssize_t.В случае ошибки возвращает
-1. ИспользуйтеPyErr_Occurred(), чтобы устранить неоднозначность.
-
unsigned long PyLong_AsUnsignedLong(PyObject *pylong) -
Часть стабильного ABI.
Возвращает представление pylong в виде значения C-типа unsigned long. pylong должен быть экземпляром
PyLongObject.Вызывает исключение
OverflowError, если значение pylong выходит за допустимый диапазон для unsigned long.В случае ошибки возвращает
(unsigned long)-1. ИспользуйтеPyErr_Occurred(), чтобы устранить неоднозначность.
-
size_t PyLong_AsSize_t(PyObject *pylong) -
Часть стабильного ABI.
Возвращает представление pylong в виде значения C-типа
size_t. pylong должен быть экземпляромPyLongObject.Вызывает исключение
OverflowError, если значение pylong выходит за допустимый диапазон дляsize_t.В случае ошибки возвращает
(size_t)-1. ИспользуйтеPyErr_Occurred(), чтобы устранить неоднозначность.
-
unsigned long long PyLong_AsUnsignedLongLong(PyObject *pylong) -
Часть стабильного ABI.
Возвращает представление pylong в виде значения C-типа unsigned long long. pylong должен быть экземпляром
PyLongObject.Вызывает исключение
OverflowError, если значение pylong выходит за допустимый диапазон для unsigned long long.В случае ошибки возвращает
(unsigned long long)-1. ИспользуйтеPyErr_Occurred(), чтобы устранить неоднозначность.Изменено в версии 3.1: Отрицательное значение pylong теперь вызывает исключение
OverflowError, а неTypeError.
-
unsigned long PyLong_AsUnsignedLongMask(PyObject *obj) -
Часть стабильного ABI.
Возвращает представление obj в виде значения C-типа unsigned long. Если 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) -
Часть стабильного ABI.
Возвращает представление obj в виде значения C-типа unsigned long long. Если 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) -
Входит в стабильный ABI с версии 3.14.
Установить *value в представление obj в виде знакового C-типа int32_t или int64_t.
Если 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) -
Входит в стабильный ABI с версии 3.14.
Установить *value в представление obj в виде беззнакового C-типа uint32_t или uint64_t.
Если obj не является экземпляром
PyLongObject, сначала вызвать его метод__index__()(если он есть), чтобы преобразовать его вPyLongObject.- Если obj отрицателен, вызвать исключение
ValueError. - Если значение obj выходит за допустимый диапазон, вызвать исключение
OverflowError.
При успехе установить *value и вернуть
0. При ошибке установить исключение и вернуть-1.value не должен быть
NULL.Добавлено в версии 3.14.
- Если obj отрицателен, вызвать исключение
-
double PyLong_AsDouble(PyObject *pylong) -
Входит в стабильный ABI.
Вернуть представление pylong в виде C-типа double. pylong должен быть экземпляром
PyLongObject.Вызвать исключение
OverflowError, если значение pylong выходит за допустимый диапазон типа double.В случае ошибки возвращает
-1.0. Для уточнения используйтеPyErr_Occurred().
-
void *PyLong_AsVoidPtr(PyObject *pylong) -
Входит в стабильный ABI.
Преобразовать целое число Python pylong в указатель C-типа void. Если pylong нельзя преобразовать, будет вызвано исключение
OverflowError. Гарантируется, что в пригодный для использования указатель void преобразуются только значения, созданные с помощьюPyLong_FromVoidPtr().В случае ошибки возвращает
NULL. Для уточнения используйтеPyErr_Occurred().
-
Py_ssize_t PyLong_AsNativeBytes(PyObject *pylong, void *buffer, Py_ssize_t n_bytes, int flags) -
Входит в стабильный ABI с версии 3.14.
Скопировать значение целого числа Python pylong в собственный buffer размером n_bytes. Для поведения, аналогичного приведению типа в C, параметру flags можно задать значение
-1; также можно использовать значения, описанные ниже, чтобы управлять поведением.В случае ошибки возвращает
-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) { // Failed. A Python exception was set with the reason. return NULL; } else if (bytes <= (Py_ssize_t)sizeof(value)) { // Success! } else { // Overflow occurred, but 'value' contains the truncated // lowest bits of pylong. }Если передать ноль в n_bytes, функция вернёт размер буфера, достаточный для хранения значения. Он может быть больше технически необходимого, но не чрезмерно. Если n_bytes=0, buffer может быть
NULL.Примечание
Передача n_bytes=0 этой функции не позволяет точно определить битовую длину значения.
Чтобы получить целиком значение Python неизвестного размера, функцию можно вызвать дважды: сначала для определения размера буфера, затем для его заполнения:
// Ask how much space we need. Py_ssize_t expected = PyLong_AsNativeBytes(pylong, NULL, 0, -1); if (expected < 0) { // Failed. A Python exception was set with the reason. return NULL; } assert(expected != 0); // Impossible per the API definition. uint8_t *bignum = malloc(expected); if (!bignum) { PyErr_SetString(PyExc_MemoryError, "bignum malloc failed."); return NULL; } // Safely get the entire value. Py_ssize_t bytes = PyLong_AsNativeBytes(pylong, bignum, expected, -1); if (bytes < 0) { // Exception has been set. free(bignum); return NULL; } else if (bytes > expected) { // This should not be possible. PyErr_SetString(PyExc_RuntimeError, "Unexpected bignum truncation after a size check."); free(bignum); return NULL; } // The expected success given the above pre-check. // ... use bignum ... free(bignum);Параметр flags принимает либо
-1(Py_ASNATIVEBYTES_DEFAULTS), чтобы выбрать параметры по умолчанию, наиболее близкие к приведению типа в C, либо комбинацию других флагов из таблицы ниже. Обратите внимание, что-1нельзя комбинировать с другими флагами.В настоящее время
-1соответствуетPy_ASNATIVEBYTES_NATIVE_ENDIAN | Py_ASNATIVEBYTES_UNSIGNED_BUFFER.Флаг
Значение
-
Py_ASNATIVEBYTES_DEFAULTS - Входит в стабильный ABI с версии 3.14.
-1-
Py_ASNATIVEBYTES_BIG_ENDIAN - Входит в стабильный ABI с версии 3.14.
0-
Py_ASNATIVEBYTES_LITTLE_ENDIAN - Входит в стабильный ABI с версии 3.14.
1-
Py_ASNATIVEBYTES_NATIVE_ENDIAN - Входит в стабильный ABI с версии 3.14.
3-
Py_ASNATIVEBYTES_UNSIGNED_BUFFER - Входит в стабильный ABI с версии 3.14.
4-
Py_ASNATIVEBYTES_REJECT_NEGATIVE - Входит в стабильный ABI с версии 3.14.
8-
Py_ASNATIVEBYTES_ALLOW_INDEX - Входит в стабильный 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 в идентификатор процесса.
В зависимости от размера типа PID в системе он может быть определён как псевдоним для
PyLong_AsLong(),PyLong_FromLongLong()илиPyLong_AsInt().Добавлено в версии 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) -
Входит в стабильный 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.
API экспорта
Добавлено в версии 3.14.
-
struct PyLongLayout -
Расположение массива «цифр» («лимбов» в терминологии GMP), используемого для представления абсолютного значения целых чисел произвольной точности.
Используйте
PyLong_GetNativeLayout(), чтобы получить собственное расположение объектов Pythonint, используемое внутри для целых чисел с достаточно большим абсолютным значением.См. также
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для порядка от старшего байта к младшему (от старшего к младшему) -
-1для порядка от младшего байта к старшему (от младшего к старшему)
-
-
-
const PyLongLayout *PyLong_GetNativeLayout(void) -
Получить собственное расположение объектов Python
int.См. структуру
PyLongLayout.Функцию нельзя вызывать до инициализации Python или после завершения работы Python. Возвращённое расположение действительно до завершения работы Python. Оно одинаково для всех подинтерпретаторов Python в процессе, поэтому его можно кэшировать.
-
struct PyLongExport -
Экспорт объекта Python
int.Возможны два случая:
- Если
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) -
Экспортировать объект Python
int.export_long должен указывать на структуру
PyLongExport, выделенную вызывающей стороной. Он не должен бытьNULL.При успехе заполнить *export_long и вернуть
0. При ошибке установить исключение и вернуть-1.Когда экспорт больше не нужен, необходимо вызвать
PyLong_FreeExport().Особенность реализации CPython: Эта функция всегда завершается успешно, если obj является объектом Python
intили его подклассом.
-
void PyLong_FreeExport(PyLongExport *export_long) -
Освободить экспорт export_long, созданный функцией
PyLong_Export().Особенность реализации CPython: Вызов
PyLong_FreeExport()необязателен, если export_long->digits равноNULL.
API PyLongWriter
API PyLongWriter можно использовать для импорта целого числа.
Добавлено в версии 3.14.
-
struct PyLongWriter -
Экземпляр средства записи целых чисел Python
int.Экземпляр необходимо уничтожить с помощью
PyLongWriter_Finish()илиPyLongWriter_Discard().
-
PyLongWriter *PyLongWriter_Create(int negative, Py_ssize_t ndigits, void **digits) -
Создать
PyLongWriter.При успехе выделить память для *digits и вернуть объект записи. При ошибке установить исключение и вернуть
NULL.negative равно
1, если число отрицательное, и0в противном случае.ndigits — количество цифр в массиве digits. Оно должно быть больше 0.
digits не должен быть NULL.
После успешного вызова этой функции вызывающая сторона должна заполнить массив цифр digits, а затем вызвать
PyLongWriter_Finish(), чтобы получить целое число Pythonint. Расположение массива digits описано вPyLong_GetNativeLayout().Значения цифр должны находиться в диапазоне [
0;(1 << bits_per_digit) - 1] (гдеbits_per_digit— количество битов на цифру). Все неиспользуемые старшие цифры должны быть установлены в0.Вместо этого можно вызвать
PyLongWriter_Discard(), чтобы уничтожить экземпляр средства записи, не создавая объектint.
-
PyObject *PyLongWriter_Finish(PyLongWriter *writer) -
Возвращаемое значение: новая ссылка.
Завершить работу с
PyLongWriter, созданным функциейPyLongWriter_Create().При успехе вернуть объект Python
int. При ошибке установить исключение и вернутьNULL.Функция нормализует цифры и при необходимости преобразует объект в компактное целое число.
После вызова экземпляр средства записи и массив digits становятся недействительными.
-
void PyLongWriter_Discard(PyLongWriter *writer) -
Удалить
PyLongWriter, созданный функциейPyLongWriter_Create().Если writer равен
NULL, никаких действий не выполняется.После вызова экземпляр средства записи и массив digits становятся недействительными.
Устаревший 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
© 2001 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.14/c-api/long.html