元组对象

类型 PyTupleObject

这个 PyObject 的子类型表示一个 Python 元组对象。

PyTypeObject PyTuple_Type
作为 稳定 ABI 的一部分。

这个 PyTypeObject 实例表示 Python 元组类型;它与 Python 层中的 tuple 对象相同。

int PyTuple_Check(PyObject *p)

如果 p 是一个元组对象或元组类型的子类型实例,则返回 True。此函数总是成功。

int PyTuple_CheckExact(PyObject *p)

如果 p 是一个元组对象,但不是元组类型的子类型实例,则返回 True。此函数总是成功。

PyObject *PyTuple_New(Py_ssize_t len)
返回值: 新引用。 稳定ABI 的一部分。

返回一个大小为 len 的新元组对象,如果失败则返回 NULL 并设置异常。

PyObject *PyTuple_Pack(Py_ssize_t n, ...)
返回值: 新引用。 稳定ABI 的一部分。

返回一个大小为 n 的新元组对象,如果失败则返回 NULL 并设置异常。元组值被初始化为指向 Python 对象的后续 n 个 C 参数。PyTuple_Pack(2, a, b) 等效于 Py_BuildValue("(OO)", a, b)

Py_ssize_t PyTuple_Size(PyObject *p)
作为 稳定 ABI 的一部分。

接受指向元组对象的指针,并返回该元组的大小。出错时,返回 -1 并设置异常。

Py_ssize_t PyTuple_GET_SIZE(PyObject *p)

PyTuple_Size() 类似,但没有错误检查。

PyObject *PyTuple_GetItem(PyObject *p, Py_ssize_t pos)
返回值: 借用引用。 稳定ABI 的一部分。

返回指针 p 所指向元组中位置 pos 的对象。如果 pos 为负数或超出范围,则返回 NULL 并设置 IndexError 异常。

返回的引用是从元组 p 借用的(也就是说:它只在您持有对 p 的引用时有效)。要获取一个 强引用,请使用 Py_NewRef(PyTuple_GetItem(...))PySequence_GetItem()

PyObject *PyTuple_GET_ITEM(PyObject *p, Py_ssize_t pos)
返回值:借用引用。

PyTuple_GetItem() 类似,但不检查其参数。

PyObject *PyTuple_GetSlice(PyObject *p, Py_ssize_t low, Py_ssize_t high)
返回值: 新引用。 稳定ABI 的一部分。

返回指针 p 所指向元组中 lowhigh 之间的切片,如果失败则返回 NULL 并设置异常。

这等同于 Python 表达式 p[low:high]。不支持从元组末尾索引。

int PyTuple_SetItem(PyObject *p, Py_ssize_t pos, PyObject *o)
作为 稳定 ABI 的一部分。

在指针 p 所指向元组的 pos 位置插入对象 o 的引用。成功时返回 0。如果 pos 超出范围,则返回 -1 并设置 IndexError 异常。

备注

此函数“窃取”对 o 的引用,并丢弃对元组中已在受影响位置的项目的引用。

void PyTuple_SET_ITEM(PyObject *p, Py_ssize_t pos, PyObject *o)

PyTuple_SetItem() 类似,但不对其参数进行错误检查,并且 应用于填充全新的元组。

如果在 调试模式with assertions 下构建 Python,则会执行边界检查作为断言。

备注

此函数“窃取”对 o 的引用,并且,与 PyTuple_SetItem() 不同,它 丢弃对任何被替换项目的引用;元组中位置 pos 处的任何引用都将泄漏。

警告

此宏 应用于新创建的元组。在已经在使用中的元组(或者换句话说,其引用计数 > 1)上使用此宏可能会导致未定义的行为。

int _PyTuple_Resize(PyObject **p, Py_ssize_t newsize)

可用于调整元组大小。newsize 将是元组的新长度。因为元组 应该 是不可变的,所以这只在对象只有一个引用时使用。如果元组可能已被代码的其他部分知道,请 不要 使用此函数。元组总是从末尾增长或缩小。可以将其视为销毁旧元组并创建一个新元组,只是效率更高。成功时返回 0。客户端代码不应假定 *p 的最终值与调用此函数之前相同。如果 *p 引用的对象被替换,则原始 *p 将被销毁。失败时,返回 -1 并将 *p 设置为 NULL,并引发 MemoryErrorSystemError

结构序列对象

结构序列对象是 namedtuple() 对象的 C 等价物,即其项目也可以通过属性访问的序列。要创建结构序列,您首先必须创建特定的结构序列类型。

PyTypeObject *PyStructSequence_NewType(PyStructSequence_Desc *desc)
返回值: 新引用。 稳定ABI 的一部分。

根据 desc 中的数据(如下所述)创建一个新的结构序列类型。可以使用 PyStructSequence_New() 创建结果类型的实例。

如果失败,则返回 NULL 并设置异常。

void PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc)

使用 desc 就地初始化结构序列类型 type

int PyStructSequence_InitType2(PyTypeObject *type, PyStructSequence_Desc *desc)

PyStructSequence_InitType() 类似,但成功时返回 0,失败时返回 -1 并设置异常。

在 3.4 版本加入。

类型 PyStructSequence_Desc
稳定 ABI 的一部分(包括所有成员)。

包含要创建的结构序列类型的元信息。

const char *name

类型的完全限定名称;以空字符结尾的 UTF-8 编码。名称必须包含模块名。

const char *doc

指向该类型文档字符串的指针,或 NULL 表示省略。

PyStructSequence_Field *fields

指向以 NULL 结尾的数组的指针,其中包含新类型的字段名。

int n_in_sequence

Python 侧可见的字段数量(如果用作元组)。

类型 PyStructSequence_Field
稳定 ABI 的一部分(包括所有成员)。

描述结构序列的一个字段。由于结构序列被建模为元组,所有字段都被类型化为 PyObject*PyStructSequence_Descfields 数组中的索引决定了哪个结构序列字段被描述。

const char *name

字段名称,或 NULL 表示结束命名字段列表,设置为 PyStructSequence_UnnamedField 表示不命名。

const char *doc

字段文档字符串,或 NULL 表示省略。

const char *const PyStructSequence_UnnamedField
自 3.11 版起成为 稳定 ABI 的一部分。

字段名称的特殊值,表示不命名。

3.9 版本中已变更: 类型已从 char * 更改。

PyObject *PyStructSequence_New(PyTypeObject *type)
返回值: 新引用。 稳定ABI 的一部分。

创建 type 的实例,该类型必须已通过 PyStructSequence_NewType() 创建。

如果失败,则返回 NULL 并设置异常。

PyObject *PyStructSequence_GetItem(PyObject *p, Py_ssize_t pos)
返回值: 借用引用。 稳定ABI 的一部分。

返回指针 p 所指向结构序列中位置 pos 的对象。

如果在 调试模式with assertions 下构建 Python,则会执行边界检查作为断言。

PyObject *PyStructSequence_GET_ITEM(PyObject *p, Py_ssize_t pos)
返回值:借用引用。

PyStructSequence_GetItem() 的别名。

3.13 版本中已变更: 现在作为 PyStructSequence_GetItem() 的别名实现。

void PyStructSequence_SetItem(PyObject *p, Py_ssize_t pos, PyObject *o)
作为 稳定 ABI 的一部分。

将结构序列 p 中索引 pos 处的字段设置为值 o。与 PyTuple_SET_ITEM() 类似,这只应用于填充全新的实例。

如果在 调试模式with assertions 下构建 Python,则会执行边界检查作为断言。

备注

此函数“窃取”对 o 的引用。

void PyStructSequence_SET_ITEM(PyObject *p, Py_ssize_t *pos, PyObject *o)

PyStructSequence_SetItem() 的别名。

3.13 版本中已变更: 现在作为 PyStructSequence_SetItem() 的别名实现。