tuple.md
1> **Источник:** https://python-all.ru/3.14/c-api/tuple.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Объекты кортежей89#### `type PyTupleObject`1011Этот подтип [`PyObject`](https://python-all.ru/3.14/c-api/structures.html#c.PyObject) представляет объект кортежа Python.1213#### `PyTypeObject PyTuple_Type`1415*Часть [Stable ABI](https://python-all.ru/3.14/c-api/stable.html#stable).*1617Этот экземпляр [`PyTypeObject`](https://python-all.ru/3.14/c-api/type.html#c.PyTypeObject) представляет тип кортежа Python; это tот же объект, что и [`tuple`](https://python-all.ru/3.14/library/stdtypes.html#tuple) на уровне Python.1819#### `int PyTuple_Check(PyObject *p)`2021Возвращает истину, если *p* является объектом кортежа или экземпляром подтипа типа кортежа. Эта функция всегда завершается успешно.2223#### `int PyTuple_CheckExact(PyObject *p)`2425Возвращает истину, если *p* является объектом кортежа, но не экземпляром подтипа типа кортежа. Эта функция всегда завершается успешно.2627#### `PyObject *PyTuple_New(Py_ssize_t len)`2829*Возвращаемое значение: новая ссылка.*3031*Часть [Stable ABI](https://python-all.ru/3.14/c-api/stable.html#stable).*3233Возвращает новый объект кортежа размером *len* или `NULL` с установленным исключением в случае ошибки.3435#### `PyObject *PyTuple_Pack(Py_ssize_t n, ...)`3637*Возвращаемое значение: новая ссылка.*3839*Часть [Stable ABI](https://python-all.ru/3.14/c-api/stable.html#stable).*4041Возвращает новый объект кортежа размером *n* или `NULL` с установленным исключением в случае ошибки. Значения кортежа инициализируются последующими *n* аргументами C, указывающими на объекты Python. `PyTuple_Pack(2, a, b)` эквивалентно `Py_BuildValue("(OO)", a, b)`.4243#### `Py_ssize_t PyTuple_Size(PyObject *p)`4445*Часть [Stable ABI](https://python-all.ru/3.14/c-api/stable.html#stable).*4647Принимает указатель на объект кортежа и возвращает размер этого кортежа. В случае ошибки возвращает `-1` с установленным исключением.4849#### `Py_ssize_t PyTuple_GET_SIZE(PyObject *p)`5051Как [`PyTuple_Size()`](https://python-all.ru/3.14/c-api/tuple.html#c.PyTuple_Size), но без проверки ошибок.5253#### `PyObject *PyTuple_GetItem(PyObject *p, Py_ssize_t pos)`5455*Возвращаемое значение: заимствованная ссылка.*5657*Часть [Stable ABI](https://python-all.ru/3.14/c-api/stable.html#stable).*5859Возвращает объект на позиции *pos* в кортеже, на который указывает *p*. Если *pos* отрицательно или выходит за границы, возвращает `NULL` и устанавливает исключение [`IndexError`](https://python-all.ru/3.14/library/exceptions.html#IndexError).6061Возвращаемая ссылка является заимствованной из кортежа *p* (то есть она действительна только до тех пор, пока удерживается ссылка на *p*). Чтобы получить [сильную ссылку](https://python-all.ru/3.14/glossary.html#term-strong-reference), используйте [`Py_NewRef(PyTuple_GetItem(...))`](https://python-all.ru/3.14/c-api/refcounting.html#c.Py_NewRef) или [`PySequence_GetItem()`](https://python-all.ru/3.14/c-api/sequence.html#c.PySequence_GetItem).6263#### `PyObject *PyTuple_GET_ITEM(PyObject *p, Py_ssize_t pos)`6465*Возвращаемое значение: заимствованная ссылка.*6667Как [`PyTuple_GetItem()`](https://python-all.ru/3.14/c-api/tuple.html#c.PyTuple_GetItem), но не проверяет свои аргументы.6869#### `PyObject *PyTuple_GetSlice(PyObject *p, Py_ssize_t low, Py_ssize_t high)`7071*Возвращаемое значение: новая ссылка.*7273*Часть [Stable ABI](https://python-all.ru/3.14/c-api/stable.html#stable).*7475Возвращает срез кортежа, на который указывает *p*, между *low* и *high*, или `NULL` с установленным исключением в случае ошибки.7677Это эквивалент выражения Python `p[low:high]`. Индексация с конца кортежа не поддерживается.7879#### `int PyTuple_SetItem(PyObject *p, Py_ssize_t pos, PyObject *o)`8081*Часть [Stable ABI](https://python-all.ru/3.14/c-api/stable.html#stable).*8283Вставляет ссылку на объект *o* в позицию *pos* кортежа, на который указывает *p*. В случае успеха возвращает `0`. Если *pos* выходит за границы, возвращает `-1` и устанавливает исключение [`IndexError`](https://python-all.ru/3.14/library/exceptions.html#IndexError).8485> **Примечание**86>87> Эта функция «[перехватывает](https://python-all.ru/3.14/glossary.html#term-steal)» ссылку на *o* и отбрасывает ссылку на элемент, уже находящийся в кортеже на изменяемой позиции (если только он не был NULL).8889#### `void PyTuple_SET_ITEM(PyObject *p, Py_ssize_t pos, PyObject *o)`9091Как [`PyTuple_SetItem()`](https://python-all.ru/3.14/c-api/tuple.html#c.PyTuple_SetItem), но без проверки ошибок; должен *использоваться только* для заполнения только что созданных кортежей.9293Проверка границ выполняется как утверждение, если Python собран в [режиме отладки](https://python-all.ru/3.14/using/configure.html#debug-build) или [`with assertions`](https://python-all.ru/3.14/using/configure.html#cmdoption-with-assertions).9495> **Примечание**96>97> Эта функция «[перехватывает](https://python-all.ru/3.14/glossary.html#term-steal)» ссылку на *o* и, в отличие от [`PyTuple_SetItem()`](https://python-all.ru/3.14/c-api/tuple.html#c.PyTuple_SetItem), *не* отбрасывает ссылку на заменяемый элемент; любая ссылка в кортеже на позиции *pos* будет потеряна.9899> **Предупреждение**100>101> Этот макрос *следует использовать только* для только что созданных кортежей. Использование этого макроса для кортежа, который уже используется (иными словами, имеет счётчик ссылок \> 1), может привести к неопределённому поведению.102103#### `int _PyTuple_Resize(PyObject **p, Py_ssize_t newsize)`104105Может использоваться для изменения размера кортежа. *newsize* будет новой длиной кортежа. Поскольку кортежи *считаются* неизменяемыми, этот макрос следует использовать только при наличии единственной ссылки на объект. *Не* используйте его, если кортеж может быть уже известен другой части кода. Кортеж всегда увеличивается или уменьшается с конца. Эту операцию можно рассматривать как уничтожение старого кортежа и создание нового, только более эффективное. Возвращает `0` в случае успеха. Клиентский код не должен предполагать, что результирующее значение `*p` останется тем же, что и до вызова этой функции. Если объект, на который ссылается `*p`, заменяется, оригинальный `*p` уничтожается. В случае неудачи возвращает `-1`, устанавливает `*p` в `NULL` и возбуждает [`MemoryError`](https://python-all.ru/3.14/library/exceptions.html#MemoryError) или [`SystemError`](https://python-all.ru/3.14/library/exceptions.html#SystemError).106107# Объекты структурных кортежей108109Объекты структурных последовательностей – это C-аналог объектов [`namedtuple()`](https://python-all.ru/3.14/library/collections.html#collections.namedtuple), т.е. последовательности, элементы которой также доступны через атрибуты. Чтобы создать структурную последовательность, сначала нужно создать конкретный тип структурной последовательности.110111#### `PyTypeObject *PyStructSequence_NewType(PyStructSequence_Desc *desc)`112113*Возвращаемое значение: новая ссылка.*114115*Часть [Stable ABI](https://python-all.ru/3.14/c-api/stable.html#stable).*116117Создаёт новый тип структурного кортежа из данных в *desc*, описанных ниже. Экземпляры полученного типа могут быть созданы с помощью [`PyStructSequence_New()`](https://python-all.ru/3.14/c-api/tuple.html#c.PyStructSequence_New).118119Возвращает `NULL` с установленным исключением при сбое.120121#### `void PyStructSequence_InitType(PyTypeObject *type, PyStructSequence_Desc *desc)`122123Инициализирует тип структурного кортежа *type* из *desc* на месте.124125#### `int PyStructSequence_InitType2(PyTypeObject *type, PyStructSequence_Desc *desc)`126127Как и [`PyStructSequence_InitType()`](https://python-all.ru/3.14/c-api/tuple.html#c.PyStructSequence_InitType), но возвращает `0` в случае успеха и `-1` с установленным исключением в случае неудачи.128129Добавлено в версии 3.4.130131#### `type PyStructSequence_Desc`132133*Часть [Stable ABI](https://python-all.ru/3.14/c-api/stable.html#stable) (включая все члены).*134135Содержит метаинформацию о типе структурного кортежа, который необходимо создать.136137#### `const char *name`138139Полное имя типа; завершается нулевым символом, кодировка UTF-8. Имя должно содержать имя модуля.140141#### `const char *doc`142143Указатель на строку документации типа или `NULL`, чтобы опустить.144145#### `PyStructSequence_Field *fields`146147Указатель на массив, завершающийся `NULL`, с именами полей нового типа.148149#### `int n_in_sequence`150151Количество полей, видимых на стороне Python (если используется как кортеж).152153#### `type PyStructSequence_Field`154155*Часть [Stable ABI](https://python-all.ru/3.14/c-api/stable.html#stable) (включая все члены).*156157Описывает поле структурного кортежа. Поскольку структурный кортеж моделируется как кортеж, все поля имеют тип [PyObject](https://python-all.ru/3.14/c-api/structures.html#c.PyObject)\*. Индекс в массиве [`fields`](https://python-all.ru/3.14/c-api/tuple.html#c.PyStructSequence_Desc.fields) структуры [`PyStructSequence_Desc`](https://python-all.ru/3.14/c-api/tuple.html#c.PyStructSequence_Desc) определяет, какое поле структурного кортежа описывается.158159#### `const char *name`160161Имя поля или `NULL`, чтобы завершить список именованных полей, установите в [`PyStructSequence_UnnamedField`](https://python-all.ru/3.14/c-api/tuple.html#c.PyStructSequence_UnnamedField), чтобы оставить безымянным.162163#### `const char *doc`164165Докстринг поля или `NULL`, чтобы опустить.166167#### `const char *const PyStructSequence_UnnamedField`168169*Часть [Stable ABI](https://python-all.ru/3.14/c-api/stable.html#stable) начиная с версии 3.11.*170171Специальное значение для имени поля, чтобы оставить его безымянным.172173Изменено в версии 3.9: Тип был изменён с `char *`.174175#### `PyObject *PyStructSequence_New(PyTypeObject *type)`176177*Возвращаемое значение: новая ссылка.*178179*Часть [Stable ABI](https://python-all.ru/3.14/c-api/stable.html#stable).*180181Создаёт экземпляр *type*, который должен быть создан с помощью [`PyStructSequence_NewType()`](https://python-all.ru/3.14/c-api/tuple.html#c.PyStructSequence_NewType).182183Возвращает `NULL` с установленным исключением при сбое.184185#### `PyObject *PyStructSequence_GetItem(PyObject *p, Py_ssize_t pos)`186187*Возвращаемое значение: заимствованная ссылка.*188189*Часть [Stable ABI](https://python-all.ru/3.14/c-api/stable.html#stable).*190191Возвращает объект в позиции *pos* структурной последовательности, на которую указывает *p*.192193Проверка границ выполняется как утверждение, если Python собран в [режиме отладки](https://python-all.ru/3.14/using/configure.html#debug-build) или [`with assertions`](https://python-all.ru/3.14/using/configure.html#cmdoption-with-assertions).194195#### `PyObject *PyStructSequence_GET_ITEM(PyObject *p, Py_ssize_t pos)`196197*Возвращаемое значение: заимствованная ссылка.*198199Псевдоним для [`PyStructSequence_GetItem()`](https://python-all.ru/3.14/c-api/tuple.html#c.PyStructSequence_GetItem).200201Изменено в версии 3.13: Теперь реализован как псевдоним для [`PyStructSequence_GetItem()`](https://python-all.ru/3.14/c-api/tuple.html#c.PyStructSequence_GetItem).202203#### `void PyStructSequence_SetItem(PyObject *p, Py_ssize_t pos, PyObject *o)`204205*Часть [Stable ABI](https://python-all.ru/3.14/c-api/stable.html#stable).*206207Устанавливает поле по индексу *pos* в struct sequence *p* в значение *o*. Как и [`PyTuple_SET_ITEM()`](https://python-all.ru/3.14/c-api/tuple.html#c.PyTuple_SET_ITEM), это следует использовать только для заполнения совсем новых экземпляров.208209Проверка границ выполняется как утверждение, если Python собран в [режиме отладки](https://python-all.ru/3.14/using/configure.html#debug-build) или [`with assertions`](https://python-all.ru/3.14/using/configure.html#cmdoption-with-assertions).210211> **Примечание**212>213> Эта функция «[крадёт](https://python-all.ru/3.14/glossary.html#term-steal)» ссылку на *o*.214215#### `void PyStructSequence_SET_ITEM(PyObject *p, Py_ssize_t *pos, PyObject *o)`216217Псевдоним для [`PyStructSequence_SetItem()`](https://python-all.ru/3.14/c-api/tuple.html#c.PyStructSequence_SetItem).218219Изменено в версии 3.13: Теперь реализован как псевдоним для [`PyStructSequence_SetItem()`](https://python-all.ru/3.14/c-api/tuple.html#c.PyStructSequence_SetItem).220