切片物件
********

PyTypeObject PySlice_Type
    * 為 穩定 ABI 的一部分.*

   slice 物件的型別物件。這與 Python 層中的 "slice" 相同。

int PySlice_Check(PyObject *ob)

   如果 *ob* 是 slice 物件，則回傳 true；*ob* 不能是 "NULL" 。此函式永
   遠成功。

PyObject *PySlice_New(PyObject *start, PyObject *stop, PyObject *step)
    *回傳值：新的參照。** 為 穩定 ABI 的一部分.*

   以指定的值回傳一個新的切片物件。*start*、*stop* 及 *step* 參數會被
   用為同名的 slice 物件屬性值。任何值都可能是 "NULL"，在這種情況下，
   "None" 將用於相對應的屬性。

   如果無法分配新物件，則回傳 "NULL" 並設定例外。

int PySlice_GetIndices(PyObject *slice, Py_ssize_t length, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step)
    * 為 穩定 ABI 的一部分.*

   從 slice 物件 *slice* 讀取開始、停止和步進索引，假設序列長度為
   *length*。將大於 *length* 的索引視為錯誤。

   成功時回傳 "0"，錯誤時回傳 "-1"，並無例外設定（除非其中一個索引不是
   "None" 並且未能轉換成整數，在這種情況下會回傳 "-1" ，並有設定例外）
   。

   你可能不想使用此功能。

   在 3.2 版的變更: 之前 *slice* 的參數型別是 "PySliceObject*" 。

int PySlice_GetIndicesEx(PyObject *slice, Py_ssize_t length, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step, Py_ssize_t *slicelength)
    * 為 穩定 ABI 的一部分.*

   可用來取代 "PySlice_GetIndices()"。從假設序列長度為 *length* 的
   slice 物件 *slice* 擷取開始、停止和步長索引，並將 slice 的長度存入
   *slicelength*。超出範圍的索引會被剪切，剪切方式與一般切片的處理方式
   一致。

   成功時回傳 "0" ，在失敗時回傳 "-1" 並設定例外。

   備註:

     這個函式對於可調整大小的序列並不安全。它的呼叫應該被
     "PySlice_Unpack()" 和 "PySlice_AdjustIndices()" 的組合取代，其中
     ：

        if (PySlice_GetIndicesEx(slice, length, &start, &stop, &step, &slicelength) < 0) {
            // return error
        }

     被更換為：

        if (PySlice_Unpack(slice, &start, &stop, &step) < 0) {
            // return error
        }
        slicelength = PySlice_AdjustIndices(length, &start, &stop, step);

   在 3.2 版的變更: 之前 *slice* 的參數型別是 "PySliceObject*" 。

   在 3.6.1 版的變更: 如果 "Py_LIMITED_API" 沒有設定或設定為
   "0x03050400" 和 "0x03060000" (不包括) 或 "0x03060100" 或更高的值
   "PySlice_GetIndicesEx()" 是使用 "PySlice_Unpack()" 和
   "PySlice_AdjustIndices()" 來實作一個巨集。引數 *start*、*stop* 和
   *step* 會被計算多次。

   在 3.6.1 版之後被棄用: 如果 "Py_LIMITED_API" 設定為小於
   "0x03050400" 或介於 "0x03060000" 和 "0x03060100" 之間 (不包括邊界值
   ) "PySlice_GetIndicesEx()" 是一個已廢棄的函式。

int PySlice_Unpack(PyObject *slice, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t *step)
    * 為 穩定 ABI 的一部分 自 3.7 版本開始.*

   以 C 整數的形式從 slice 物件中抽取 start、stop 及 step 資料成員。將
   大於 "PY_SSIZE_T_MAX" 的值靜默減少為 "PY_SSIZE_T_MAX"，將小於
   "PY_SSIZE_T_MIN" 的 start 和 stop 值靜默提升為 "PY_SSIZE_T_MIN"，將
   小於 "-PY_SSIZE_T_MAX" 的 step 值靜默提升為 "-PY_SSIZE_T_MAX"。

   成功時回傳 "0"，在失敗時回傳 "-1" 並設定例外。

   在 3.6.1 版被加入.

Py_ssize_t PySlice_AdjustIndices(Py_ssize_t length, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t step)
    * 為 穩定 ABI 的一部分 自 3.7 版本開始.*

   假設序列長度為指定長度，調整開始/結束切片索引。超出範圍的索引會以與
   處理正常切片一致的方式切除。

   回傳切片的長度。永遠成功。不呼叫 Python 程式碼。

   在 3.6.1 版被加入.


Ellipsis 物件
=============

PyTypeObject PyEllipsis_Type
    * 為 穩定 ABI 的一部分.*

   Python "Ellipsis" 物件的型別。與 Python 層中的 "types.EllipsisType"
   相同。

PyObject *Py_Ellipsis

   Python "Ellipsis" 物件。這個物件沒有方法。就像 "Py_None" 一樣，它是
   一個 *immortal* 單一物件。

   在 3.12 版的變更: "Py_Ellipsis" 為不滅的 (immortal)。
