# 切片对象

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` 一样是单例对象。