Целочисленные объекты
Все целые числа реализованы как «длинные» целочисленные объекты произвольного размера.
При возникновении ошибки большинство функций API PyLong_As* возвращают (return type)-1, которое невозможно отличить от числа. Используйте PyErr_Occurred() для устранения неоднозначности.
-
type PyLongObject -
Часть Limited API (как непрозрачная структура).
Этот подтип
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до256. При создании целого числа в этом диапазоне вы фактически получаете ссылку на уже существующий объект.
-
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_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 интерпретируется с использованием определения Целочисленные литералы; в этом случае ведущие нули в ненулевом десятичном числе вызываютValueError. Если base не равен0, он должен находиться в диапазоне от2до36включительно. Начальные и конечные пробельные символы, а также одиночные символы подчеркивания после спецификатора основания и между цифрами игнорируются. Если цифры отсутствуют или строка str не заканчивается символом NULL после цифр и конечных пробельных символов, будет вызвано исключениеValueError.См. также
Методы Python
int.to_bytes()иint.from_bytes()для преобразованияPyLongObjectв массив байтов с основанием256и обратно. Их можно вызвать из C с помощьюPyObject_CallMethod().
-
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) -
Создает целое число 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) -
Создает целое число Python из значения, содержащегося в первых n_bytes буфера buffer, интерпретируемого как число без знака.
Параметр flags аналогичен
PyLong_AsNativeBytes(). Передача-1выберет нативный порядок байтов, с которым был скомпилирован CPython, и будет считать, что старший бит не является знаковым. Флаги, отличные от порядка байтов, игнорируются.Добавлено в версии 3.13.
-
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) -
Псевдоним со статусом soft deprecated. Полностью эквивалентен предпочтительному
PyLong_AsLong. В частности, он может завершиться ошибкойOverflowErrorили другим исключением.Устарело начиная с версии 3.14: Функция мягко устарела (soft deprecated).
-
-
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.
Возвращает C-представление типа unsigned long long для obj. Если obj не является экземпляром
PyLongObject, сначала вызывается его метод__index__()(если он присутствует), чтобы преобразовать его вPyLongObject.Если значение obj выходит за пределы диапазона для unsigned long long, возвращает результат приведения этого значения по модулю
ULLONG_MAX + 1.Возвращает
(unsigned long long)-1при ошибке. ИспользуйтеPyErr_Occurred()для устранения неоднозначности.Изменено в версии 3.8: Использовать
__index__(), если доступен.Изменено в версии 3.10: Эта функция больше не будет использовать
__int__().
-
double PyLong_AsDouble(PyObject *pylong) -
Часть Stable ABI.
Возвращает C-представление типа double для pylong. pylong должен быть экземпляром
PyLongObject.Вызывает исключение
OverflowError, если значение pylong выходит за пределы диапазона для double.Возвращает
-1.0при ошибке. ИспользуйтеPyErr_Occurred()для устранения неоднозначности.
-
void *PyLong_AsVoidPtr(PyObject *pylong) -
Часть Stable 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) -
Копирует целочисленное значение 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никогда не возвращается.Значения всегда копируются в дополнительном коде (two’s-complement).
Пример использования:
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
-1-
Py_ASNATIVEBYTES_BIG_ENDIAN
0-
Py_ASNATIVEBYTES_LITTLE_ENDIAN
1-
Py_ASNATIVEBYTES_NATIVE_ENDIAN
3-
Py_ASNATIVEBYTES_UNSIGNED_BUFFER
4-
Py_ASNATIVEBYTES_REJECT_NEGATIVE
8-
Py_ASNATIVEBYTES_ALLOW_INDEX
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.
-
-
PyObject *PyLong_GetInfo(void) -
Часть Stable ABI.
При успешном выполнении возвращает доступный только для чтения именованный кортеж, содержащий информацию о внутреннем представлении целых чисел в Python. Описание отдельных полей см. в
sys.int_info.В случае сбоя возвращает
NULLс установленным исключением.Добавлено в версии 3.1.
-
int PyUnstable_Long_IsCompact(const PyLongObject *op) -
Это Unstable API. Оно может изменяться без предварительного уведомления в минорных релизах.
Возвращает 1, если op является компактным, и 0 в противном случае.
Эта функция позволяет критичному к производительности коду реализовывать «быстрый путь» (fast path) для небольших целых чисел. Для компактных значений используйте
PyUnstable_Long_CompactValue(); для остальных переходите на функцииPyLong_As*илиPyLong_AsNativeBytes().Ожидается, что ускорение для большинства пользователей будет незначительным.
То, какие именно значения считаются компактными, является деталью реализации и может измениться.
Добавлено в версии 3.12.
-
Py_ssize_t PyUnstable_Long_CompactValue(const PyLongObject *op) -
Это Unstable API. Оно может изменяться без предварительного уведомления в минорных релизах.
Если op является компактным, как определено с помощью
PyUnstable_Long_IsCompact(), возвращает его значение.В противном случае возвращаемое значение не определено.
Добавлено в версии 3.12.
© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/c-api/long.html