复数对象

从 C API 的角度来看,Python 的复数对象实现为两种不同的类型:一种是暴露给 Python 程序的 Python 对象,另一种是表示实际复数值的 C 结构。该 API 提供了用于处理这两种类型的函数。

作为 C 结构的复数

请注意,接受这些结构作为参数并将其作为结果返回的函数是通过而不是通过指针取消引用来执行的。这在整个 API 中是一致的。

type Py_complex

C 结构,它对应于 Python 复数对象的值部分。 大多数用于处理复数对象的函数都使用此类型的结构作为输入或输出值(视情况而定)。

double real
double imag

该结构定义为

typedef struct {
    double real;
    double imag;
} Py_complex;
Py_complex _Py_c_sum(Py_complex left, Py_complex right)

返回两个复数的和,使用 C Py_complex 表示形式。

Py_complex _Py_c_diff(Py_complex left, Py_complex right)

返回两个复数的差,使用 C Py_complex 表示形式。

Py_complex _Py_c_neg(Py_complex num)

返回复数 num 的取反,使用 C Py_complex 表示形式。

Py_complex _Py_c_prod(Py_complex left, Py_complex right)

返回两个复数的乘积,使用 C Py_complex 表示形式。

Py_complex _Py_c_quot(Py_complex dividend, Py_complex divisor)

返回两个复数的商,使用 C Py_complex 表示形式。

如果 divisor 为空,则此方法返回零并将 errno 设置为 EDOM

Py_complex _Py_c_pow(Py_complex num, Py_complex exp)

返回 numexp 次幂,使用 C Py_complex 表示形式。

如果 num 为空且 exp 不是正实数,则此方法返回零并将 errno 设置为 EDOM

作为 Python 对象的复数

type PyComplexObject

PyObject 的子类型表示 Python 复数对象。

PyTypeObject PyComplex_Type
稳定 ABI 的一部分。

PyTypeObject 的实例表示 Python 复数类型。它与 Python 层中的 complex 对象相同。

int PyComplex_Check(PyObject *p)

如果其参数是 PyComplexObjectPyComplexObject 的子类型,则返回 true。此函数始终成功。

int PyComplex_CheckExact(PyObject *p)

如果其参数是 PyComplexObject,但不是 PyComplexObject 的子类型,则返回 true。此函数始终成功。

PyObject *PyComplex_FromCComplex(Py_complex v)
返回值:新引用。

从 C Py_complex 值创建一个新的 Python 复数对象。如果发生错误,则返回 NULL 并设置异常。

PyObject *PyComplex_FromDoubles(double real, double imag)
返回值:新的引用。稳定 ABI 的一部分。

realimag 返回一个新的 PyComplexObject 对象。如果发生错误,则返回 NULL 并设置异常。

double PyComplex_RealAsDouble(PyObject *op)
稳定 ABI 的一部分。

以 C double 类型返回 op 的实部。

如果 op 不是 Python 复数对象,但具有 __complex__() 方法,则会先调用此方法将 op 转换为 Python 复数对象。如果未定义 __complex__(),则会回退到调用 PyFloat_AsDouble() 并返回其结果。

如果失败,此方法会返回 -1.0 并设置异常,因此应调用 PyErr_Occurred() 来检查错误。

在 3.13 版本中变更: 如果可用,则使用 __complex__()

double PyComplex_ImagAsDouble(PyObject *op)
稳定 ABI 的一部分。

以 C double 类型返回 op 的虚部。

如果 op 不是 Python 复数对象,但具有 __complex__() 方法,则会先调用此方法将 op 转换为 Python 复数对象。如果未定义 __complex__(),则会回退到调用 PyFloat_AsDouble(),并在成功时返回 0.0

如果失败,此方法会返回 -1.0 并设置异常,因此应调用 PyErr_Occurred() 来检查错误。

在 3.13 版本中变更: 如果可用,则使用 __complex__()

Py_complex PyComplex_AsCComplex(PyObject *op)

返回复数 opPy_complex 值。

如果 op 不是 Python 复数对象,但具有 __complex__() 方法,则会先调用此方法将 op 转换为 Python 复数对象。如果未定义 __complex__(),则会回退到 __float__()。如果未定义 __float__(),则会回退到 __index__()

如果失败,此方法会返回 Py_complex,其中 real 设置为 -1.0,并设置异常,因此应调用 PyErr_Occurred() 来检查错误。

在 3.8 版本中变更: 如果可用,则使用 __index__()