# 切片对象

PyTypeObject PySlice_Type
  属于 稳定 ABI.

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

int PySlice_Check(PyObject *ob)

  如果 ob 是一个 slice 对象则返回真值；ob 必须不为 `NULL`。 此函数总是会成功执行。

PyObject *PySlice_New(PyObject *start, PyObject *stop, PyObject *step)
  返回值：新的引用。 属于 稳定 ABI.

  返回一个具有给定值的新切片对象。 start, stop 和 step 形参会被用作该切片对象相同名称的属性值。 这些值中的任何一个都可以为 `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 提取 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)
  属于 稳定 ABI.

  `PySlice_GetIndices()` 的可用替代。 从切片对象 slice 提取 start, stop 和 step 索引号，将序列长度视为 length，并将切片的长度保存在 slicelength 中，超出范围的索引号会以与普通切片一致的方式进行剪切。

  成功时返回 `0` 而在出错时返回 `-1` 并设置一个异常。

  备注

  此函数对于可变大小序列来说是不安全的。 对它的调用应被替换为 `PySlice_Unpack()` 和 `PySlice_AdjustIndices()` 的组合，其中

      if (PySlice_GetIndicesEx(slice, length, &start, &stop, &step, &slicelength) < 0) {
          // 返回错误
      }

  会被替换为

      if (PySlice_Unpack(slice, &start, &stop, &step) < 0) {
          // 返回错误
      }
      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 版起.

  从切片对象中将 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`。

  Added in version 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 版起.

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

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

  Added in version 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` 是永久性对象。