複數物件

從 C API 來看,Python 的複數物件被實作為兩種不同的型別:一種是公開給 Python 程式的 Python 物件,另一種是表示實際複數值的 C 結構。API 提供了與兩者一起作用的函式。

作為 C 結構的複數

請注意,接受這些結構作為參數並將它們作為結果回傳的函式是按值 (by value) 執行的,而不是透過指標取消參照 (dereference) 它們。這在整個 API 中都是一致的。

typePy_complex

相對於 Python 複數物件之數值部分的 C 結構。大多數處理複數物件的函式根據需求會使用這種型別的結構作為輸入或輸出值。

doublereal
doubleimag

該結構被定義為:

typedefstruct{doublereal;doubleimag;}Py_complex;
Py_complex_Py_c_sum(Py_complexleft,Py_complexright)

以 C 的Py_complex 表示形式來回傳兩個複數之和。

Py_complex_Py_c_diff(Py_complexleft,Py_complexright)

以 C 的Py_complex 表示形式來回傳兩個複數間的差。

Py_complex_Py_c_neg(Py_complexnum)

以 C 的Py_complex 表示形式來回傳複數num 的相反數 (negation)。

Py_complex_Py_c_prod(Py_complexleft,Py_complexright)

以 C 的Py_complex 表示形式來回傳兩個複數的乘積。

Py_complex_Py_c_quot(Py_complexdividend,Py_complexdivisor)

以 C 的Py_complex 表示形式來回傳兩個複數的商。

如果divisor 為 null,則此方法會回傳零並將errno 設定為EDOM

Py_complex_Py_c_pow(Py_complexnum,Py_complexexp)

以 C 的Py_complex 表示形式來回傳numexp 次方的結果。

如果num 為 null 且exp 不是正實數,則此方法會回傳零並將errno 設定為EDOM

作為 Python 物件的複數

typePyComplexObject

這個PyObject 的子型別代表一個 Python 複數物件。

PyTypeObjectPyComplex_Type
穩定 ABI 的一部分.

這個PyTypeObject 的實例代表 Python 複數型別。它與 Python 層中的complex 是同一個物件。

intPyComplex_Check(PyObject*p)

如果其引數是一個PyComplexObject 或者是PyComplexObject 的子型別,則會回傳 true。這個函式不會失敗。

intPyComplex_CheckExact(PyObject*p)

如果其引數是一個PyComplexObject,但不是PyComplexObject 的子型別,則會回傳 true。這個函式不會失敗。

PyObject*PyComplex_FromCComplex(Py_complexv)
回傳值:新的參照。

從 C 的Py_complex 值建立一個新的 Python 複數物件。在錯誤時回傳NULL 並設定例外。

PyObject*PyComplex_FromDoubles(doublereal,doubleimag)
回傳值:新的參照。穩定 ABI 的一部分.

realimag 回傳一個新的PyComplexObject 物件。在錯誤時回傳NULL 並設定例外。

doublePyComplex_RealAsDouble(PyObject*op)
穩定 ABI 的一部分.

以 C 的double 形式回傳op 的實部。

如果op 不是 Python 複數物件,但有一個__complex__() 方法,則首先會呼叫該方法將op 轉換為 Python 複數物件。如果__complex__() 並未定義,那麼它會回退到呼叫PyFloat_AsDouble() 並回傳其結果。

失敗時,此方法回傳-1.0 並設定例外,因此應該呼叫PyErr_Occurred() 來檢查錯誤。

在 3.13 版的變更:如果可用則使用__complex__()

doublePyComplex_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_complexPyComplex_AsCComplex(PyObject*op)

回傳複數opPy_complex 值。

如果op 不是 Python 複數物件,但有一個__complex__() 方法,則首先會呼叫該方法將op 轉換為 Python 複數物件。如果__complex__() 並未定義,那麼它會回退到__float__()。如果__float__() 未定義,則它將繼續回退為__index__()

失敗時,此方法回傳Py_complex 並將real 設為-1.0,並設定例外,因此應該呼叫PyErr_Occurred() 來檢查錯誤。

在 3.8 版的變更:如果可用則使用__index__()