Number Protocol

  • int PyNumber_Check(PyObject ** o *)

    • 如果对象* o *提供数字协议,则返回1,否则返回 false。此Function始终成功。
  • PyObject * PyNumber_Add(PyObject *o1 PyObject o2 *)

    • 返回值:新参考.

返回将* o1 o2 相加的结果,如果失败则返回 NULL *。这等效于 Python 表达式o1 + o2

返回从* o1 减去 o2 的结果,如果失败则返回 NULL *。这等效于 Python 表达式o1 - o2

返回将* o1 o2 相乘的结果,如果失败则返回 NULL *。这等效于 Python 表达式o1 * o2

返回将* o1 除以 o2 的结果,如果失败则返回 NULL *。这等效于 Python 表达式o1 / o2

返回* o1 的下限除以 o2 或失败时的 NULL *。这等效于整数的“经典”除法。

2.2 版中的新Function。

返回* o1 的 math 值除以 o2 的合理近似值,如果失败,则返回 NULL *。因为二进制浮点数是近似值,所以返回值是“ approximate”。不可能以二为底表示所有实数。传递两个整数时,此函数可以返回浮点值。

2.2 版中的新Function。

返回* o1 除以 o2 的余数,如果失败则返回 NULL *。这等效于 Python 表达式o1 % o2

请参阅内置Functiondivmod()。失败时返回* NULL *。这等效于 Python 表达式divmod(o1, o2)

请参阅内置Functionpow()。失败时返回* NULL 。这等效于 Python 表达式pow(o1, o2, o3),其中 o3 是可选的。如果要忽略 o3 ,请在其位置传递Py_None(为 o3 传递 NULL *将导致非法的内存访问)。

如果成功,则返回* o 取反,如果失败,则返回 NULL *。这等效于 Python 表达式-o

成功返回* o ,失败返回 NULL *。这等效于 Python 表达式+o

返回* o 的绝对值,如果失败则返回 NULL *。这等效于 Python 表达式abs(o)

如果成功,则返回* o 的按位取反,如果失败,则返回 NULL *。这等效于 Python 表达式~o

如果成功,则返回将* o1 左移 o2 的结果,如果失败,则返回 NULL *的结果。这等效于 Python 表达式o1 << o2

如果成功,返回右移* o1 * * 2 的结果,否则返回* NULL *。这等效于 Python 表达式o1 >> o2

成功返回* o1 o2 的“按位与”,失败则返回 NULL *。这等效于 Python 表达式o1 & o2

如果成功,则返回* o1 的“按位异或”或 o2 ,如果失败,则返回 NULL *。这等效于 Python 表达式o1 ^ o2

如果成功,则返回* o1 o2 的“按位或”,如果失败,则返回 NULL *。这等效于 Python 表达式o1 | o2

返回将* o1 o2 相加的结果,如果失败则返回 NULL 。如果 o1 *支持,则操作就地完成。这等效于 Python 语句o1 += o2

返回从* o1 减去 o2 的结果,如果失败则返回 NULL 。如果 o1 *支持,则操作就地完成。这等效于 Python 语句o1 -= o2

返回将* o1 o2 相乘的结果,如果失败则返回 NULL 。如果 o1 *支持,则操作就地完成。这等效于 Python 语句o1 *= o2

返回将* o1 除以 o2 的结果,如果失败则返回 NULL 。如果 o1 *支持,则操作就地完成。这等效于 Python 语句o1 /= o2

返回将* o1 除以 o2 的 math 底线,如果失败则返回 NULL 。如果 o1 *支持,则操作就地完成。这等效于 Python 语句o1 //= o2

2.2 版中的新Function。

返回* o1 的 math 值除以 o2 的合理近似值,如果失败,则返回 NULL 。因为二进制浮点数是近似值,所以返回值是“ approximate”。不可能以二为底表示所有实数。传递两个整数时,此函数可以返回浮点值。如果 o1 *支持,则操作就地完成。

2.2 版中的新Function。

返回* o1 除以 o2 的余数,如果失败则返回 NULL 。如果 o1 *支持,则操作就地完成。这等效于 Python 语句o1 %= o2

请参阅内置Functionpow()。失败时返回* NULL 。如果 o1 支持,则操作就地完成。当 o3 为Py_None时,这等效于 Python 语句o1 **= o2,否则为pow(o1, o2, o3)的就地变体。如果 o3 被忽略,则在其位置传递Py_None(为 o3 传递 NULL *将导致非法的内存访问)。

如果成功,则返回将* o1 左移 o2 的结果,如果失败,则返回 NULL 的结果。如果 o1 *支持,则操作就地完成。这等效于 Python 语句o1 <<= o2

如果成功,返回右移* o1 * * 2 的结果,否则返回* NULL 。如果 o1 *支持,则操作就地完成。这等效于 Python 语句o1 >>= o2

成功返回* o1 o2 的“按位与”,失败则返回 NULL 。如果 o1 *支持,则操作就地完成。这等效于 Python 语句o1 &= o2

如果成功,则返回* o1 的“按位异或”或 o2 ,如果失败,则返回 NULL 。如果 o1 *支持,则操作就地完成。这等效于 Python 语句o1 ^= o2

如果成功,则返回* o1 o2 的“按位或”,如果失败,则返回 NULL 。如果 o1 *支持,则操作就地完成。这等效于 Python 语句o1 |= o2

  • 整数PyNumber_Coerce(PyObject *** p1 PyObject* * p2 *)
    • 此函数采用类型为PyObject*的两个变量的地址。如果*p1*p2指向的对象具有相同的类型,请增加其引用计数并返回0(成功)。如果对象可以转换为通用数字类型,则将*p1*p2替换为其转换后的值(使用“新”引用计数),然后返回0。如果无法进行转换,或者发生其他错误,请返回-1(失败),并且不要增加引用计数。调用PyNumber_Coerce(&o1, &o2)等效于 Python 语句o1, o2 = coerce(o1, o2)
  • 整数PyNumber_CoerceEx(PyObject *** p1 PyObject* * p2 *)

    • 该函数与PyNumber_Coerce()相似,除了在无法进行转换且未引发错误时返回1。在这种情况下,引用计数仍不会增加。
  • PyObject * PyNumber_Int(PyObject ** o *)

    • 返回值:新参考.

如果成功,则返回* o 转换为整数对象,如果失败,则返回 NULL *。如果参数超出整数范围,则将返回一个长对象。这等效于 Python 表达式int(o)

如果成功,则返回* o 转换为长整数对象,如果失败,则返回 NULL *。这等效于 Python 表达式long(o)

如果成功,则返回* o 转换为 float 对象,如果失败,则返回 NULL *。这等效于 Python 表达式float(o)

  • PyObject * PyNumber_Index(PyObject ** o *)
    • 返回* o 转换为 Python int 或成功时长;或返回 NULL *,失败时引发TypeError异常。

2.5 版的新Function。

  • PyObject * PyNumber_ToBase(PyObject ** n *,int * base *)
    • 返回整数* n 转换为 base 作为字符串,其基本标记为'0b''0o''0x'(如果适用)。当 base 不是 2、8、10 或 16 时,格式为'x#num',其中 x 为底数。如果 n *不是 int 对象,则首先使用PyNumber_Index()进行转换。

2.6 版的新Function。

  • Py_ssize_t PyNumber_AsSsize_t(PyObject *o PyObject exc *)
    • 如果* o 可以解释为整数,则返回 o 转换为 Py_ssize_t 值。如果 o 可以转换为 Python int 或 long,但是try转换为 Py_ssize_t 值将引发OverflowError,则 exc 参数是将引发的异常类型(通常为IndexErrorOverflowError)。如果 exc NULL ,那么将清除异常,并将值剪切为 PY_SSIZE_T_MIN (对于负整数)或 PY_SSIZE_T_MAX *(对于正整数)。

2.5 版的新Function。

  • int PyIndex_Check(PyObject ** o *)
    • 如果* o *是一个索引整数(已填充 tp_as_number 结构的 nb_index 插槽),则返回1,否则返回0

2.5 版的新Function。