> **Источник:** https://python-all.ru/3.2/c-api/number.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# Протокол чисел

#### `int PyNumber_Check(PyObject *o)`

Возвращает `1`, если объект *o* предоставляет числовые протоколы, и false в противном случае. Эта функция всегда завершается успешно.

#### `PyObject* PyNumber_Add(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

Возвращает результат сложения *o1* и *o2* или *NULL* в случае ошибки. Это эквивалент выражения Python `o1 + o2`.

#### `PyObject* PyNumber_Subtract(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

Возвращает результат вычитания *o2* из *o1* или *NULL* в случае ошибки. Это эквивалент выражения Python `o1 - o2`.

#### `PyObject* PyNumber_Multiply(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

Возвращает результат умножения *o1* и *o2* или *NULL* в случае ошибки. Это эквивалент выражения Python `o1 * o2`.

#### `PyObject* PyNumber_FloorDivide(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

Возвращает целую часть от деления *o1* на *o2* или *NULL* в случае ошибки. Эквивалентно «классическому» делению целых чисел.

#### `PyObject* PyNumber_TrueDivide(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

Возвращает разумное приближение математического значения от деления *o1* на *o2* или *NULL* в случае ошибки. Возвращаемое значение является «приблизительным», потому что числа с плавающей запятой в двоичном представлении приблизительны; невозможно представить все действительные числа в двоичной системе. Эта функция может вернуть значение с плавающей запятой, если ей переданы два целых числа.

#### `PyObject* PyNumber_Remainder(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

Возвращает остаток от деления *o1* на *o2* или *NULL* в случае ошибки. Это эквивалент выражения Python `o1 % o2`.

#### `PyObject* PyNumber_Divmod(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

См. встроенную функцию [`divmod()`](https://python-all.ru/3.2/library/functions.html#divmod). Возвращает *NULL* в случае ошибки. Это эквивалент выражения Python `divmod(o1, o2)`.

#### `PyObject* PyNumber_Power(PyObject *o1, PyObject *o2, PyObject *o3)`

*Возвращаемое значение: новая ссылка.*

См. встроенную функцию [`pow()`](https://python-all.ru/3.2/library/functions.html#pow). Возвращает *NULL* в случае ошибки. Это эквивалент выражения Python `pow(o1, o2, o3)`, где *o3* необязателен. Если *o3* нужно игнорировать, передайте [`Py_None`](https://python-all.ru/3.2/c-api/none.html#Py_None) вместо него (передача *NULL* для *o3* привела бы к недопустимому доступу к памяти).

#### `PyObject* PyNumber_Negative(PyObject *o)`

*Возвращаемое значение: новая ссылка.*

Возвращает отрицание *o* в случае успеха или *NULL* в случае ошибки. Это эквивалент выражения Python `-o`.

#### `PyObject* PyNumber_Positive(PyObject *o)`

*Возвращаемое значение: новая ссылка.*

Возвращает *o* в случае успеха или *NULL* в случае ошибки. Это эквивалент выражения Python `+o`.

#### `PyObject* PyNumber_Absolute(PyObject *o)`

*Возвращаемое значение: новая ссылка.*

Возвращает абсолютное значение *o* или *NULL* в случае ошибки. Это эквивалент выражения Python `abs(o)`.

#### `PyObject* PyNumber_Invert(PyObject *o)`

*Возвращаемое значение: новая ссылка.*

Возвращает побитовое отрицание *o* в случае успеха или *NULL* в случае ошибки. Это эквивалент выражения Python `~o`.

#### `PyObject* PyNumber_Lshift(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

Возвращает результат сдвига *o1* влево на *o2* в случае успеха или *NULL* в случае ошибки. Это эквивалент выражения Python `o1 << o2`.

#### `PyObject* PyNumber_Rshift(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

Возвращает результат сдвига *o1* вправо на *o2* в случае успеха или *NULL* в случае ошибки. Это эквивалент выражения Python `o1 >> o2`.

#### `PyObject* PyNumber_And(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

Возвращает побитовое И (and) *o1* и *o2* в случае успеха или *NULL* в случае ошибки. Это эквивалент выражения Python `o1 & o2`.

#### `PyObject* PyNumber_Xor(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

Возвращает побитовое исключающее ИЛИ (xor) *o1* и *o2* в случае успеха или *NULL* в случае ошибки. Это эквивалент выражения Python `o1 ^ o2`.

#### `PyObject* PyNumber_Or(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

Возвращает «побитовое ИЛИ» *o1* и *o2* в случае успеха или *NULL* при ошибке. Это эквивалент выражения Python `o1 | o2`.

#### `PyObject* PyNumber_InPlaceAdd(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

Возвращает результат сложения *o1* и *o2* или *NULL* при ошибке. Операция выполняется *на месте (in-place)*, если *o1* это поддерживает. Это эквивалент оператора Python `o1 += o2`.

#### `PyObject* PyNumber_InPlaceSubtract(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

Возвращает результат вычитания *o2* из *o1* или *NULL* при ошибке. Операция выполняется *на месте (in-place)*, если *o1* это поддерживает. Это эквивалент оператора Python `o1 -= o2`.

#### `PyObject* PyNumber_InPlaceMultiply(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

Возвращает результат умножения *o1* и *o2* или *NULL* при ошибке. Операция выполняется *на месте (in-place)*, если *o1* это поддерживает. Это эквивалент оператора Python `o1 *= o2`.

#### `PyObject* PyNumber_InPlaceFloorDivide(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

Возвращает результат целочисленного деления с округлением вниз (floor) *o1* на *o2* или *NULL* при ошибке. Операция выполняется *на месте (in-place)*, если *o1* это поддерживает. Это эквивалент оператора Python `o1 //= o2`.

#### `PyObject* PyNumber_InPlaceTrueDivide(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

Возвращает разумное приближение математического значения от деления *o1* на *o2* или *NULL* в случае ошибки. Возвращаемое значение является «приблизительным», потому что числа с плавающей запятой в двоичном представлении приблизительны; невозможно представить все действительные числа в двоичной системе. Эта функция может вернуть значение с плавающей запятой, если ей переданы два целых числа. Операция выполняется *на месте*, если *o1* это поддерживает.

#### `PyObject* PyNumber_InPlaceRemainder(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

Возвращает остаток от деления *o1* на *o2* или *NULL* при ошибке. Операция выполняется *на месте (in-place)*, если *o1* это поддерживает. Это эквивалент оператора Python `o1 %= o2`.

#### `PyObject* PyNumber_InPlacePower(PyObject *o1, PyObject *o2, PyObject *o3)`

*Возвращаемое значение: новая ссылка.*

См. встроенную функцию [`pow()`](https://python-all.ru/3.2/library/functions.html#pow). Возвращает *NULL* при ошибке. Операция выполняется *на месте (in-place)*, если *o1* это поддерживает. Это эквивалент оператора Python `o1 **= o2`, когда o3 равен [`Py_None`](https://python-all.ru/3.2/c-api/none.html#Py_None), или вариант на месте (in-place) для `pow(o1, o2, o3)` в противном случае. Если *o3* нужно игнорировать, передайте [`Py_None`](https://python-all.ru/3.2/c-api/none.html#Py_None) вместо него (передача *NULL* для *o3* приведет к недопустимому доступу к памяти).

#### `PyObject* PyNumber_InPlaceLshift(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

Возвращает результат сдвига *o1* влево на *o2* в случае успеха или *NULL* при ошибке. Операция выполняется *на месте (in-place)*, если *o1* это поддерживает. Это эквивалент оператора Python `o1 <<= o2`.

#### `PyObject* PyNumber_InPlaceRshift(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

Возвращает результат сдвига *o1* вправо на *o2* в случае успеха или *NULL* при ошибке. Операция выполняется *на месте (in-place)*, если *o1* это поддерживает. Это эквивалент оператора Python `o1 >>= o2`.

#### `PyObject* PyNumber_InPlaceAnd(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

Возвращает результат побитового И (bitwise and) *o1* и *o2* в случае успеха или *NULL* при ошибке. Операция выполняется *на месте (in-place)*, если *o1* это поддерживает. Это эквивалент оператора Python `o1 &= o2`.

#### `PyObject* PyNumber_InPlaceXor(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

Возвращает результат побитового исключающего ИЛИ (bitwise exclusive or) *o1* и *o2* в случае успеха или *NULL* при ошибке. Операция выполняется *на месте (in-place)*, если *o1* это поддерживает. Это эквивалент оператора Python `o1 ^= o2`.

#### `PyObject* PyNumber_InPlaceOr(PyObject *o1, PyObject *o2)`

*Возвращаемое значение: новая ссылка.*

Возвращает «побитовое ИЛИ» *o1* и *o2* в случае успеха или *NULL* при ошибке. Операция выполняется *на месте (in-place)*, если *o1* это поддерживает. Это эквивалент оператора Python `o1 |= o2`.

#### `PyObject* PyNumber_Long(PyObject *o)`

*Возвращаемое значение: новая ссылка.*

Возвращает *o*, преобразованный в целое число (объект int) в случае успеха, или *NULL* при ошибке. Это эквивалент выражения Python `int(o)`.

#### `PyObject* PyNumber_Float(PyObject *o)`

*Возвращаемое значение: новая ссылка.*

Возвращает *o*, преобразованный в число с плавающей точкой (объект float) в случае успеха, или *NULL* при ошибке. Это эквивалент выражения Python `float(o)`.

#### `PyObject* PyNumber_Index(PyObject *o)`

Возвращает *o*, преобразованный в целое число Python (int) в случае успеха, или *NULL* с возбуждением исключения [`TypeError`](https://python-all.ru/3.2/library/exceptions.html#TypeError) при ошибке.

#### `PyObject* PyNumber_ToBase(PyObject *n, int base)`

Возвращает строковое представление целого числа *n*, преобразованного в систему счисления по основанию *base*. Аргумент *base* должен быть одним из 2, 8, 10 или 16. Для оснований 2, 8 или 16 возвращаемая строка дополняется префиксом, обозначающим основание: `'0b'`, `'0o'` или `'0x'` соответственно. Если *n* не является целым числом Python (int), оно сначала преобразуется с помощью [`PyNumber_Index()`](https://python-all.ru/3.2/c-api/number.html#PyNumber_Index).

#### `Py_ssize_t PyNumber_AsSsize_t(PyObject *o, PyObject *exc)`

Возвращает *o*, преобразованное в значение Py\_ssize\_t, если *o* может быть интерпретировано как целое число. Если вызов завершается неудачей, возбуждается исключение и возвращается -1.

Если *o* может быть преобразовано в целое число Python (int), но попытка преобразования в значение Py\_ssize\_t вызвала бы исключение [`OverflowError`](https://python-all.ru/3.2/library/exceptions.html#OverflowError), то аргумент *exc* – это тип исключения, которое будет возбуждено (обычно [`IndexError`](https://python-all.ru/3.2/library/exceptions.html#IndexError) или [`OverflowError`](https://python-all.ru/3.2/library/exceptions.html#OverflowError)). Если *exc* равен *NULL*, то исключение очищается, а значение усекается до *PY\_SSIZE\_T\_MIN* для отрицательного целого числа или до *PY\_SSIZE\_T\_MAX* для положительного.

#### `int PyIndex_Check(PyObject *o)`

Возвращает True, если *o* является индексным целым числом (т.е. имеет заполненный слот nb\_index в структуре tp\_as\_number).
