切片对象

PyTypeObject PySlice_Type

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

int PySlice_Check(PyObject *ob)

如果 ob 是一个切片对象则返回真值;ob 必须不为 NULL

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

返回一个具有给定值的新切片对象。 start, stopstep 形参会被用作 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 提取 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 提取 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 未设置或设置为 0x030504000x03060000 之间的值(不包括边界)或 0x03060100 或更大则 !PySlice_GetIndicesEx 会被实现为一个使用 !PySlice_Unpack!PySlice_AdjustIndices 的宏。 参数 start, stopstep 会被多被求值。

3.6.1 版后已移除: 如果 Py_LIMITED_API 设置为小于 0x030504000x030600000x03060100 之间的值(不包括边界)则 !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 一样属于单例对象。