複數物件

Python 的複數物件在 C API 中被視為兩種不同的型別實現:一種是暴露給 Python 程式的 Python 物件,另一種是表示實際複數值的 C 結構。該 API 提供了用於處理這兩種型別的功能。

作為 C 結構的複數

請注意,接受這些結構作為引數並將其作為結果返回的函式是“按值”而不是透過指標解引用來執行此操作的。這在整個 API 中保持一致。

type Py_complex

對應於 Python 複數物件的數值部分的 C 結構。大多數處理複數物件的函式都將此型別的結構用作輸入或輸出值,視情況而定。

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)

使用 C Py_complex 表示返回複數 num 的負數。

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)

使用 C Py_complex 表示返回 numexp 次冪。

如果 num 為空且 exp 不是正實數,此方法返回零並將 errno 設定為 EDOM

溢位時將 errno 設定為 ERANGE

作為 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 的一部分。

op 的實部作為 C double 返回。

如果 op 不是 Python 複數物件但具有 __complex__() 方法,則首先呼叫此方法將 op 轉換為 Python 複數物件。如果未定義 __complex__(),則回退呼叫 PyFloat_AsDouble() 並返回其結果。

失敗時,此方法返回 -1.0 並設定一個異常,因此應呼叫 PyErr_Occurred() 來檢查錯誤。

3.13 版本中已更改: 如果可用,使用 __complex__()

double PyComplex_ImagAsDouble(PyObject *op)
作為 穩定 ABI 的一部分。

op 的虛部作為 C double 返回。

如果 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__()(如果可用)。