> **Источник:** https://python-all.ru/2.7/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_Divide(PyObject *o1, PyObject *o2)`

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

Returns the result of dividing *o1* by *o2*, or *NULL* on failure. This is the equivalent of the Python expression `o1 / o2`.

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

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

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

Новое в версии 2.2.

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

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

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

Новое в версии 2.2.

#### `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/2.7/library/functions.html#divmod). Возвращает *NULL* в случае ошибки. Эквивалентно выражению Python `divmod(o1, o2)`.

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

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

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

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

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

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

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

Возвращает результат «побитового исключающего ИЛИ» над *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* в случае ошибки. Операция выполняется *на месте*, если *o1* это поддерживает. Эквивалентно инструкции Python `o1 += o2`.

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

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

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

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

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

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

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

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

Returns the result of dividing *o1* by *o2*, or *NULL* on failure. The operation is done *in-place* when *o1* supports it. This is the equivalent of the Python statement `o1 /= o2`.

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

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

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

Новое в версии 2.2.

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

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

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

Новое в версии 2.2.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#### `int PyNumber_Coerce(PyObject **p1, PyObject **p2)`

Эта функция принимает адреса двух переменных типа [`PyObject*`](https://python-all.ru/2.7/c-api/structures.html#c.PyObject). Если объекты, на которые указывают `*p1` и `*p2`, имеют один тип, увеличивает их счётчик ссылок и возвращает `0` (успех). Если объекты можно преобразовать к общему числовому типу, заменяет `*p1` и `*p2` на их преобразованные значения (с «новыми» счётчиками ссылок) и возвращает `0`. Если преобразование невозможно или произошла другая ошибка, возвращает `-1` (неудача) и не увеличивает счётчики ссылок. Вызов `PyNumber_Coerce(&o1, &o2)` эквивалентен оператору Python `o1, o2 = coerce(o1, o2)`.

#### `int PyNumber_CoerceEx(PyObject **p1, PyObject **p2)`

Эта функция похожа на [`PyNumber_Coerce()`](https://python-all.ru/2.7/c-api/number.html#c.PyNumber_Coerce), за исключением того, что возвращает `1`, когда преобразование невозможно и не возникает ошибки. Счётчики ссылок в этом случае по-прежнему не увеличиваются.

#### `PyObject* PyNumber_Int(PyObject *o)`

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

Returns the *o* converted to an integer object on success, or *NULL* on failure. If the argument is outside the integer range a long object will be returned instead. This is the equivalent of the Python expression `int(o)`.

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

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

Returns the *o* converted to a long integer object on success, or *NULL* on failure. This is the equivalent of the Python expression `long(o)`.

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

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

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

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

Returns the *o* converted to a Python int or long on success or *NULL* with a [`TypeError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.TypeError) exception raised on failure.

Новое в версии 2.5.

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

Returns the integer *n* converted to *base* as a string with a base marker of `'0b'`, `'0o'`, or `'0x'` if applicable. When *base* is not 2, 8, 10, or 16, the format is `'x#num'` where x is the base. If *n* is not an int object, it is converted with [`PyNumber_Index()`](https://python-all.ru/2.7/c-api/number.html#c.PyNumber_Index) first.

Новое в версии 2.6.

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

Returns *o* converted to a Py\_ssize\_t value if *o* can be interpreted as an integer. If *o* can be converted to a Python int or long but the attempt to convert to a Py\_ssize\_t value would raise an [`OverflowError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.OverflowError), then the *exc* argument is the type of exception that will be raised (usually [`IndexError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.IndexError) or [`OverflowError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.OverflowError)). If *exc* is *NULL*, then the exception is cleared and the value is clipped to *PY\_SSIZE\_T\_MIN* for a negative integer or *PY\_SSIZE\_T\_MAX* for a positive integer.

Новое в версии 2.5.

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

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

Новое в версии 2.5.
