数字协议 — Python 文档

来自菜鸟教程
Python/docs/3.7/c-api/number
跳转至:导航、​搜索

号码协议

int PyNumber_Check(PyObject *o)
如果对象 o 提供数字协议,则返回 1,否则返回 false。 此功能总是成功。
PyObject *PyNumber_Add(PyObject *o1, PyObject *o2)
返回将 o1o2NULL 相加失败的结果。 这相当于 Python 表达式 o1 + o2
PyObject *PyNumber_Subtract(PyObject *o1, PyObject *o2)
返回失败时从 o1NULL 减去 o2 的结果。 这相当于 Python 表达式 o1 - o2
PyObject *PyNumber_Multiply(PyObject *o1, PyObject *o2)
返回乘以 o1o2 或失败时 NULL 的结果。 这相当于 Python 表达式 o1 * o2
PyObject *PyNumber_MatrixMultiply(PyObject *o1, PyObject *o2)

在失败时返回 o1o2NULL 上的矩阵乘法结果。 这相当于 Python 表达式 o1 @ o2

3.5 版中的新功能。

PyObject *PyNumber_FloorDivide(PyObject *o1, PyObject *o2)
返回o1除以o2或失败时NULL的底数。 这相当于整数的“经典”除法。
PyObject *PyNumber_TrueDivide(PyObject *o1, PyObject *o2)
在失败时返回 o1 除以 o2NULL 的数学值的合理近似值。 返回值是“近似值”,因为二进制浮点数是近似值; 不可能以二为底表示所有实数。 当传递两个整数时,此函数可以返回一个浮点值。
PyObject *PyNumber_Remainder(PyObject *o1, PyObject *o2)
在失败时返回 o1 除以 o2NULL 的余数。 这相当于 Python 表达式 o1 % o2
PyObject *PyNumber_Divmod(PyObject *o1, PyObject *o2)
请参阅内置函数 divmod()。 失败时返回 NULL。 这相当于 Python 表达式 divmod(o1, o2)
PyObject *PyNumber_Power(PyObject *o1, PyObject *o2, PyObject *o3)
见内置函数pow()。 失败时返回 NULL。 这相当于 Python 表达式 pow(o1, o2, o3),其中 o3 是可选的。 如果要忽略 o3,则在其位置传递 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)
失败时返回 oNULL 的绝对值。 这相当于 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)
成功时返回 o1o2 的“按位与”,失败时返回 NULL。 这相当于 Python 表达式 o1 & o2
PyObject *PyNumber_Xor(PyObject *o1, PyObject *o2)
成功时返回 o1 的“按位异或”通过 o2,失败时返回 NULL。 这相当于 Python 表达式 o1 ^ o2
PyObject *PyNumber_Or(PyObject *o1, PyObject *o2)
成功时返回 o1o2 的“按位或”,失败时返回 NULL。 这相当于 Python 表达式 o1 | o2
PyObject *PyNumber_InPlaceAdd(PyObject *o1, PyObject *o2)
返回将 o1o2NULL 相加失败的结果。 当o1支持时,该操作在就地完成。 这相当于 Python 语句 o1 += o2
PyObject *PyNumber_InPlaceSubtract(PyObject *o1, PyObject *o2)
返回失败时从 o1NULL 减去 o2 的结果。 当o1支持时,该操作在就地完成。 这相当于 Python 语句 o1 -= o2
PyObject *PyNumber_InPlaceMultiply(PyObject *o1, PyObject *o2)
返回乘以 o1o2 或失败时 NULL 的结果。 当o1支持时,该操作在就地完成。 这相当于 Python 语句 o1 *= o2
PyObject *PyNumber_InPlaceMatrixMultiply(PyObject *o1, PyObject *o2)

在失败时返回 o1o2NULL 上的矩阵乘法结果。 当o1支持时,该操作在就地完成。 这相当于 Python 语句 o1 @= o2

3.5 版中的新功能。

PyObject *PyNumber_InPlaceFloorDivide(PyObject *o1, PyObject *o2)
返回失败时将 o1 除以 o2NULL 的数学底线。 当o1支持时,该操作在就地完成。 这相当于 Python 语句 o1 //= o2
PyObject *PyNumber_InPlaceTrueDivide(PyObject *o1, PyObject *o2)
在失败时返回 o1 除以 o2NULL 的数学值的合理近似值。 返回值是“近似值”,因为二进制浮点数是近似值; 不可能以二为底表示所有实数。 当传递两个整数时,此函数可以返回一个浮点值。 当o1支持时,该操作在就地完成。
PyObject *PyNumber_InPlaceRemainder(PyObject *o1, PyObject *o2)
在失败时返回 o1 除以 o2NULL 的余数。 当o1支持时,该操作在就地完成。 这相当于 Python 语句 o1 %= o2
PyObject *PyNumber_InPlacePower(PyObject *o1, PyObject *o2, PyObject *o3)
见内置函数pow()。 失败时返回 NULL。 当o1支持时,该操作在就地完成。 当 o3 为 Py_None 时,这等效于 Python 语句 o1 **= o2,否则为 pow(o1, o2, o3) 的就地变体。 如果要忽略 o3,则在其位置传递 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)
成功时返回 o1o2 的“按位与”,失败时返回 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)
成功时返回 o1o2 的“按位或”,失败时返回 NULL。 当o1支持时,该操作在就地完成。 这相当于 Python 语句 o1 |= o2
PyObject *PyNumber_Long(PyObject *o)
成功时返回 o 转换为整数对象,失败时返回 NULL。 这相当于 Python 表达式 int(o)
PyObject *PyNumber_Float(PyObject *o)
成功时返回 o 转换为浮点对象,失败时返回 NULL。 这相当于 Python 表达式 float(o)
PyObject *PyNumber_Index(PyObject *o)
返回成功时转换为 Python int 的 o 或失败时引发 TypeError 异常的 NULL
PyObject *PyNumber_ToBase(PyObject *n, int base)
以字符串形式返回转换为基数 基数 的整数 nbase 参数必须是 2、8、10 或 16 之一。 对于基数 2、8 或 16,返回的字符串分别以 '0b''0o''0x' 的基数标记为前缀。 如果 n 不是 Python int,则首先使用 PyNumber_Index() 进行转换。
Py_ssize_t PyNumber_AsSsize_t(PyObject *o, PyObject *exc)

如果 o 可以解释为整数,则返回 o 转换为 Py_ssize_t 值。 如果调用失败,则会引发异常并返回 -1

如果 o 可以转换为 Python int 但尝试转换为 Py_ssize_t 值会引发 OverflowError,则 exc 参数是异常类型这将被引发(通常是 IndexErrorOverflowError)。 如果 excNULL,则清除异常,并将值剪裁为 PY_SSIZE_T_MIN(对于负整数)或 PY_SSIZE_T_MAX(对于正整数)。

int PyIndex_Check(PyObject *o)
如果 o 是索引整数(填充了 tp_as_number 结构的 nb_index 槽),则返回 1,否则返回 0。 此功能总是成功。