切片对象
********

PyTypeObject PySlice_Type

   切片对象的类型对象。 它与 Python 层面的 "slice" 是相同的对象。

int PySlice_Check(PyObject *ob)

   如果 *ob* 是一个 slice 对象则返回真值；*ob* 必须不为 "NULL"。

PyObject* PySlice_New(PyObject *start, PyObject *stop, PyObject *step)
    *Return value: New reference.*

   返回一个具有给定值的新 slice 对象。 *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)

   从 slice 对象 *slice* 提取 start, stop 和 step 索引号，将序列长度视
   为 *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)

   "PySlice_GetIndices()" 的可用替代。 从 slice 对象 *slice* 提取
   start, stop 和 step 索引号，将序列长度视为 *length*，并将切片的长度
   保存在 *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)

   从切片对象中将 start, stop 和 step 数据成员提取为 C 整数。 会静默地
   将大于 "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"。

   出错时返回 "-1"，成功时返回 "0"。

   3.6.1 新版功能.

Py_ssize_t PySlice_AdjustIndices(Py_ssize_t length, Py_ssize_t *start, Py_ssize_t *stop, Py_ssize_t step)

   将 start/end 切片索引号根据指定的序列长度进行调整。 超出范围的索引
   号会以与普通切片一致的方式进行剪切。

   返回切片的长度。 此操作总是会成功。 不会调用 Python 代码。

   3.6.1 新版功能.


Ellipsis 对象
*************

PyObject *Py_Ellipsis

   Python 的 "Ellipsis" 对象。 该对象没有任何方法。 它必须以与任何其他
   对象一样的方式遵循引用计数。 它与 "Py_None" 一样是单例对象。
