序列协议 — Python 文档

来自菜鸟教程
Python/docs/3.8/c-api/sequence
跳转至:导航、​搜索

序列协议

int PySequence_Check(PyObject *o)
如果对象提供序列协议,则返回 1,否则返回 0。 请注意,它为具有 __getitem__() 方法的 Python 类返回 1,除非它们是 dict 子类,因为在一般情况下无法确定它支持的键类型。 此功能总是成功。
Py_ssize_t PySequence_Size(PyObject *o)


Py_ssize_t PySequence_Length(PyObject *o)

成功时按顺序返回对象数 o,失败时返回 -1。 这相当于 Python 表达式 len(o)
PyObject *PySequence_Concat(PyObject *o1, PyObject *o2)
成功时返回 o1o2 的连接,失败时返回 NULL。 这相当于 Python 表达式 o1 + o2
PyObject *PySequence_Repeat(PyObject *o, Py_ssize_t count)
返回重复序列对象 o count 次或失败时 NULL 的结果。 这相当于 Python 表达式 o * count
PyObject *PySequence_InPlaceConcat(PyObject *o1, PyObject *o2)
成功时返回 o1o2 的连接,失败时返回 NULL。 当o1支持时,该操作在就地完成。 这相当于 Python 表达式 o1 += o2
PyObject *PySequence_InPlaceRepeat(PyObject *o, Py_ssize_t count)
返回重复序列对象 o count 次或失败时 NULL 的结果。 当 o 支持时,操作在 就地 完成。 这相当于 Python 表达式 o *= count
PyObject *PySequence_GetItem(PyObject *o, Py_ssize_t i)
失败时返回 oNULL 的第 i 个元素。 这相当于 Python 表达式 o[i]
PyObject *PySequence_GetSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2)
在失败时返回 i1i2 之间的序列对象 o 的切片,或 NULL。 这相当于 Python 表达式 o[i1:i2]
int PySequence_SetItem(PyObject *o, Py_ssize_t i, PyObject *v)

将对象 v 分配给 o 的第 i 个元素。 引发异常并在失败时返回 -1; 成功返回 0。 这相当于 Python 语句 o[i] = v。 此函数 不会 窃取对 v 的引用。

如果 vNULL,则删除该元素,但不推荐使用此功能,而是使用 PySequence_DelItem()

int PySequence_DelItem(PyObject *o, Py_ssize_t i)
删除对象 o 的第 i 个元素。 失败时返回 -1。 这相当于 Python 语句 del o[i]
int PySequence_SetSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2, PyObject *v)
将序列对象 v 分配给序列对象 o 中的切片,从 i1i2。 这相当于 Python 语句 o[i1:i2] = v
int PySequence_DelSlice(PyObject *o, Py_ssize_t i1, Py_ssize_t i2)
i1i2删除序列对象o中的切片。 失败时返回 -1。 这相当于 Python 语句 del o[i1:i2]
Py_ssize_t PySequence_Count(PyObject *o, PyObject *value)
返回ovalue的出现次数,即返回o[key] == value对应的key的个数。 失败时,返回 -1。 这相当于 Python 表达式 o.count(value)
int PySequence_Contains(PyObject *o, PyObject *value)
确定 o 是否包含 。 如果 o 中的一项等于 value,则返回 1,否则返回 0。 出错时,返回 -1。 这相当于 Python 表达式 value in o
Py_ssize_t PySequence_Index(PyObject *o, PyObject *value)
返回第一个索引 i 其中 o[i] == value。 出错时,返回 -1。 这相当于 Python 表达式 o.index(value)
PyObject *PySequence_List(PyObject *o)
在失败时返回与序列或可迭代 [X72X]o 或 NULL 具有相同内容的列表对象。 返回的列表保证是新的。 这相当于 Python 表达式 list(o)
PyObject *PySequence_Tuple(PyObject *o)
失败时返回与序列或可迭代 [X73X]o 或 NULL 具有相同内容的元组对象。 如果 o 是一个元组,将返回一个新的引用,否则将使用适当的内容构造一个元组。 这相当于 Python 表达式 tuple(o)
PyObject *PySequence_Fast(PyObject *o, const char *m)

返回序列或可迭代 o 作为其他 PySequence_Fast* 系列函数可用的对象。 如果对象不是序列或可迭代对象,则使用 m 作为消息文本引发 TypeError。 失败时返回 NULL

PySequence_Fast* 函数之所以如此命名是因为它们假定 oPyTupleObjectPyListObject 并访问 o[ X160X] 直接。

作为 CPython 的实现细节,如果 o 已经是一个序列或列表,它将被返回。

Py_ssize_t PySequence_Fast_GET_SIZE(PyObject *o)
返回 o 的长度,假设 oPySequence_Fast() 返回,并且 o 不是 NULL . 大小也可以通过在 o 上调用 PySequence_Size() 来获得,但是 PySequence_Fast_GET_SIZE() 更快,因为它可以假设 o 是一个列表或元组。
PyObject *PySequence_Fast_GET_ITEM(PyObject *o, Py_ssize_t i)
返回o的第i个元素,假设oPySequence_Fast()返回,o为不是 NULL,并且 i 在范围内。
PyObject **PySequence_Fast_ITEMS(PyObject *o)

返回底层的 PyObject 指针数组。 假设 oPySequence_Fast() 返回,而 o 不是 NULL

请注意,如果列表被调整大小,重新分配可能会重新定位项目数组。 因此,仅在序列无法更改的上下文中使用底层数组指针。

PyObject *PySequence_ITEM(PyObject *o, Py_ssize_t i)
失败时返回 oNULL 的第 i 个元素。 PySequence_GetItem() 的更快形式,但没有检查 o 上的 PySequence_Check() 是否为真,并且没有对负索引进行调整。