複數物件

從 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__()