Документация Python неофициальный перевод

bytes.md

362 строк · 30.4 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.15/c-api/bytes.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# Объекты bytes89Эти функции возбуждают [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError), если ожидается параметр bytes, а вызываются с параметром, не являющимся bytes.1011#### `type PyBytesObject`1213Этот подтип [`PyObject`](https://python-all.ru/3.15/c-api/structures.html#c.PyObject) представляет объект Python bytes.1415#### `PyTypeObject PyBytes_Type`1617*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*1819Этот экземпляр [`PyTypeObject`](https://python-all.ru/3.15/c-api/type.html#c.PyTypeObject) представляет тип bytes в Python; это тот же объект, что и [`bytes`](https://python-all.ru/3.15/library/stdtypes.html#bytes) в слое Python.2021#### `int PyBytes_Check(PyObject *o)`2223Возвращает true, если объект *o* является объектом bytes или экземпляром подтипа типа bytes. Эта функция всегда завершается успешно.2425#### `int PyBytes_CheckExact(PyObject *o)`2627Возвращает true, если объект *o* является объектом bytes, но не экземпляром подтипа типа bytes. Эта функция всегда завершается успешно.2829#### `PyObject *PyBytes_FromString(const char *v)`3031*Возвращаемое значение: новая ссылка.*3233*Часть [стабильного ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*3435*Потокобезопасность: [атомарно](https://python-all.ru/3.15/library/threadsafety.html#threadsafety-level-atomic).*3637Возвращает новый объект bytes с копией строки *v* в качестве значения в случае успеха, и `NULL` в случае неудачи. Параметр *v* не должен быть `NULL`; он не будет проверяться.3839#### `PyObject *PyBytes_FromStringAndSize(const char *v, Py_ssize_t len)`4041*Возвращаемое значение: новая ссылка.*4243*Часть [стабильного ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*4445*Потокобезопасность: [атомарно](https://python-all.ru/3.15/library/threadsafety.html#threadsafety-level-atomic).*4647Возвращает новый объект bytes с копией строки *v* в качестве значения и длины *len* в случае успеха, и `NULL` в случае неудачи. Если *v* равно `NULL`, содержимое объекта bytes не инициализировано.4849[Мягко устарело](https://python-all.ru/3.15/glossary.html#term-soft-deprecated) с версии 3.15: Используйте API [`PyBytesWriter`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytesWriter) вместо `PyBytes_FromStringAndSize(NULL, len)`.5051#### `PyObject *PyBytes_FromFormat(const char *format, ...)`5253*Возвращаемое значение: новая ссылка.*5455*Часть [стабильного ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*5657*Потокобезопасность: [атомарно](https://python-all.ru/3.15/library/threadsafety.html#threadsafety-level-atomic).*5859Принимает строку формата в стиле C `printf()`, строку *format* и переменное количество аргументов, вычисляет размер результирующего объекта bytes Python и возвращает объект bytes, в который отформатированы значения. Переменные аргументы должны быть типами C и точно соответствовать символам формата в строке *format*. Допускаются следующие символы формата:6061| Символы формата | Тип | Описание |62| --- | --- | --- |63| `%%` | *н/д* | Буквальный символ %. |64| `%c` | int | Один байт, представленный как C int. |65| `%d` | int | Эквивалентно `printf("%d")`. [\[1\]](https://python-all.ru/3.15/c-api/bytes.html#id9) |66| `%u` | unsigned int | Эквивалентно `printf("%u")`. [\[1\]](https://python-all.ru/3.15/c-api/bytes.html#id9) |67| `%ld` | long | Эквивалентно `printf("%ld")`. [\[1\]](https://python-all.ru/3.15/c-api/bytes.html#id9) |68| `%lu` | unsigned long | Эквивалентно `printf("%lu")`. [\[1\]](https://python-all.ru/3.15/c-api/bytes.html#id9) |69| `%zd` | [`Py_ssize_t`](https://python-all.ru/3.15/c-api/intro.html#c.Py_ssize_t) | Эквивалентно `printf("%zd")`. [\[1\]](https://python-all.ru/3.15/c-api/bytes.html#id9) |70| `%zu` | size\_t | Эквивалентно `printf("%zu")`. [\[1\]](https://python-all.ru/3.15/c-api/bytes.html#id9) |71| `%i` | int | Эквивалентно `printf("%i")`. [\[1\]](https://python-all.ru/3.15/c-api/bytes.html#id9) |72| `%x` | int | Эквивалентно `printf("%x")`. [\[1\]](https://python-all.ru/3.15/c-api/bytes.html#id9) |73| `%s` | const char\* | Нуль-терминированный массив символов C. |74| `%p` | const void\* | Шестнадцатеричное представление указателя C. В основном эквивалентно `printf("%p")`, за исключением того, что гарантированно начинается с литерала `0x` независимо от того, что возвращает `printf` на данной платформе. |7576Нераспознанный символ формата приводит к тому, что вся оставшаяся строка формата копируется как есть в результирующий объект, а все лишние аргументы отбрасываются.7778\[1\]7980([1](https://python-all.ru/3.15/c-api/bytes.html#id1),[2](https://python-all.ru/3.15/c-api/bytes.html#id2),[3](https://python-all.ru/3.15/c-api/bytes.html#id3),[4](https://python-all.ru/3.15/c-api/bytes.html#id4),[5](https://python-all.ru/3.15/c-api/bytes.html#id5),[6](https://python-all.ru/3.15/c-api/bytes.html#id6),[7](https://python-all.ru/3.15/c-api/bytes.html#id7),[8](https://python-all.ru/3.15/c-api/bytes.html#id8))8182Для целочисленных спецификаторов (d, u, ld, lu, zd, zu, i, x): флаг преобразования '0' действует, даже если задана точность.8384#### `PyObject *PyBytes_FromFormatV(const char *format, va_list vargs)`8586*Возвращаемое значение: новая ссылка.*8788*Часть [стабильного ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*8990*Потокобезопасность: [атомарно](https://python-all.ru/3.15/library/threadsafety.html#threadsafety-level-atomic).*9192Идентично [`PyBytes_FromFormat()`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytes_FromFormat), за исключением того, что принимает ровно два аргумента.9394#### `PyObject *PyBytes_FromObject(PyObject *o)`9596*Возвращаемое значение: новая ссылка.*9798*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*99100*Потокобезопасность: [Безопасно для одновременного использования на одном объекте](https://python-all.ru/3.15/library/threadsafety.html#threadsafety-level-shared).*101102Возвращает байтовое представление объекта *o*, реализующего протокол буфера.103104> **Примечание**105>106> Если объект реализует протокол буфера, то буфер не должен изменяться во время создания байтового объекта.107108#### `Py_ssize_t PyBytes_Size(PyObject *o)`109110*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*111112*Потокобезопасность: [Атомарно](https://python-all.ru/3.15/library/threadsafety.html#threadsafety-level-atomic).*113114Возвращает длину байтов в байтовом объекте *o*.115116#### `Py_ssize_t PyBytes_GET_SIZE(PyObject *o)`117118*Потокобезопасность: [атомарно](https://python-all.ru/3.15/library/threadsafety.html#threadsafety-level-atomic).*119120Аналогично [`PyBytes_Size()`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytes_Size), но без проверки ошибок.121122#### `char *PyBytes_AsString(PyObject *o)`123124*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*125126*Потокобезопасность: [Безопасен для вызова из нескольких потоков только с внешней синхронизацией](https://python-all.ru/3.15/library/threadsafety.html#threadsafety-level-compatible).*127128Возвращает указатель на содержимое *o*. Указатель ссылается на внутренний буфер объекта *o*, который состоит из `len(o) + 1` байтов. Последний байт в буфере всегда нулевой, независимо от наличия других нулевых байтов. Данные нельзя изменять никаким образом, за исключением случая, когда объект только что был создан с помощью `PyBytes_FromStringAndSize(NULL, size)`. Его нельзя освобождать. Если *o* вообще не является байтовым объектом, [`PyBytes_AsString()`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytes_AsString) возвращает `NULL` и возбуждает [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError).129130#### `char *PyBytes_AS_STRING(PyObject *string)`131132*Потокобезопасность: [Безопасно вызывать из нескольких потоков только с внешней синхронизацией](https://python-all.ru/3.15/library/threadsafety.html#threadsafety-level-compatible).*133134Аналогично [`PyBytes_AsString()`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytes_AsString), но без проверки ошибок.135136#### `int PyBytes_AsStringAndSize(PyObject *obj, char **buffer, Py_ssize_t *length)`137138*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*139140*Потокобезопасность: [Безопасен для вызова из нескольких потоков только с внешней синхронизацией](https://python-all.ru/3.15/library/threadsafety.html#threadsafety-level-compatible).*141142Возвращает содержимое объекта *obj*, завершающееся нулевым байтом, через выходные переменные *buffer* и *length*. В случае успеха возвращает `0`.143144Если *length* равно `NULL`, байтовый объект не может содержать встроенные нулевые байты; если содержит, функция возвращает `-1` и возбуждается [`ValueError`](https://python-all.ru/3.15/library/exceptions.html#ValueError).145146Буфер ссылается на внутренний буфер *obj*, который содержит дополнительный нулевой байт в конце (не учитывается в *length*). Данные нельзя изменять никаким образом, за исключением случая, когда объект только что был создан с помощью `PyBytes_FromStringAndSize(NULL, size)`. Его нельзя освобождать. Если *obj* вообще не является байтовым объектом, [`PyBytes_AsStringAndSize()`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytes_AsStringAndSize) возвращает `-1` и возбуждает [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError).147148Изменено в версии 3.5: Ранее, [`TypeError`](https://python-all.ru/3.15/library/exceptions.html#TypeError) возбуждалось, когда в байтовом объекте встречались встроенные нулевые байты.149150#### `void PyBytes_Concat(PyObject **bytes, PyObject *newpart)`151152*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*153154*Потокобезопасность: [Безопасно для одновременного использования на одном объекте](https://python-all.ru/3.15/library/threadsafety.html#threadsafety-level-shared).*155156Создаёт новый байтовый объект в *\*bytes*, содержащий содержимое *newpart*, добавленное к *bytes*; вызывающий получит новую ссылку. Ссылка на старое значение *bytes* будет «[украдена](https://python-all.ru/3.15/glossary.html#term-steal)». Если новый объект не может быть создан, старая ссылка на *bytes* всё равно будет «украдена», значение *\*bytes* будет установлено в `NULL`, и будет установлено соответствующее исключение.157158> **Примечание**159>160> Если *newpart* реализует протокол буфера, то буфер не должен изменяться во время создания нового байтового объекта.161162#### `void PyBytes_ConcatAndDel(PyObject **bytes, PyObject *newpart)`163164*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*165166*Потокобезопасность: [Безопасно для одновременного использования на одном объекте](https://python-all.ru/3.15/library/threadsafety.html#threadsafety-level-shared).*167168Создаёт новый байтовый объект в *\*bytes*, содержащий содержимое *newpart*, добавленное к *bytes*. Эта версия освобождает [сильную ссылку](https://python-all.ru/3.15/glossary.html#term-strong-reference) на *newpart* (т.е. уменьшает счётчик ссылок).169170> **Примечание**171>172> Если *newpart* реализует протокол буфера, то буфер не должен изменяться во время создания нового байтового объекта.173174#### `PyObject *PyBytes_Join(PyObject *sep, PyObject *iterable)`175176*Потокобезопасность: [Безопасно для одновременного использования на одном объекте](https://python-all.ru/3.15/library/threadsafety.html#threadsafety-level-shared).*177178Аналогично `sep.join(iterable)` в Python.179180*sep* должен быть объектом Python [`bytes`](https://python-all.ru/3.15/library/stdtypes.html#bytes). (Обратите внимание, что [`PyUnicode_Join()`](https://python-all.ru/3.15/c-api/unicode.html#c.PyUnicode_Join) принимает разделитель `NULL` и обрабатывает его как пробел, тогда как [`PyBytes_Join()`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytes_Join) не принимает разделитель `NULL`.)181182*iterable* должен быть итерируемым объектом, порождающим объекты, реализующие [буферный протокол](https://python-all.ru/3.15/c-api/buffer.html#bufferobjects).183184В случае успеха возвращает новый объект [`bytes`](https://python-all.ru/3.15/library/stdtypes.html#bytes). В случае ошибки устанавливает исключение и возвращает `NULL`.185186Добавлено в версии 3.14.187188> **Примечание**189>190> Если объекты *iterable* реализуют буферный протокол, то буферы не должны изменяться во время создания нового объекта bytes.191192#### `int _PyBytes_Resize(PyObject **bytes, Py_ssize_t newsize)`193194*Потокобезопасность: [Можно безопасно вызывать без внешней синхронизации для разных объектов](https://python-all.ru/3.15/library/threadsafety.html#threadsafety-level-distinct).*195196Изменяет размер объекта bytes. *newsize* – новая длина объекта bytes. Можно считать, что это создание нового объекта bytes и уничтожение старого, только более эффективно. Передайте адрес существующего объекта bytes как lvalue (в него может быть произведена запись) и желаемый новый размер. В случае успеха *\*bytes* содержит изменённый объект bytes и возвращается `0`; адрес в *\*bytes* может отличаться от исходного значения. Если перераспределение не удалось, исходный объект bytes по адресу *\*bytes* освобождается, *\*bytes* устанавливается в `NULL`, устанавливается [`MemoryError`](https://python-all.ru/3.15/library/exceptions.html#MemoryError) и возвращается `-1`.197198[Мягко устарело](https://python-all.ru/3.15/glossary.html#term-soft-deprecated) с версии 3.15: Вместо этого используйте API [`PyBytesWriter`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytesWriter).199200#### `PyObject *PyBytes_Repr(PyObject *bytes, int smartquotes)`201202*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*203204*Потокобезопасность: [Атомарно](https://python-all.ru/3.15/library/threadsafety.html#threadsafety-level-atomic).*205206Возвращает строковое представление *bytes*. Эта функция в настоящее время используется для реализации `bytes.__repr__()` в Python.207208Эта функция не выполняет проверку типа; передача *bytes* в качестве объекта, не являющегося bytes, или `NULL` приводит к неопределённому поведению.209210Если *smartquotes* равно true, представление будет использовать строку в двойных кавычках вместо строки в одинарных кавычках, если в *bytes* присутствуют одинарные кавычки. Например, байтовая строка `'Python'` будет представлена как `b"'Python'"`, когда *smartquotes* равно true, или как `b'\'Python\''`, когда оно равно false.211212В случае успеха эта функция возвращает [сильную ссылку](https://python-all.ru/3.15/glossary.html#term-strong-reference) на объект [`str`](https://python-all.ru/3.15/library/stdtypes.html#str), содержащий представление. В случае ошибки возвращается `NULL` с установленным исключением.213214#### `PyObject *PyBytes_DecodeEscape(const char *s, Py_ssize_t len, const char *errors, Py_ssize_t unicode, const char *recode_encoding)`215216*Часть [Stable ABI](https://python-all.ru/3.15/c-api/stable.html#stable).*217218*Потокобезопасность: [Атомарно](https://python-all.ru/3.15/library/threadsafety.html#threadsafety-level-atomic).*219220Обрабатывает управляющие последовательности в строке с обратной косой чертой *s*. *s* не должно быть `NULL`. *len* должно быть размером *s*.221222*errors* должно быть одним из `"strict"`, `"replace"` или `"ignore"`. Если *errors* равно `NULL`, то по умолчанию используется `"strict"`.223224В случае успеха эта функция возвращает [сильную ссылку](https://python-all.ru/3.15/glossary.html#term-strong-reference) на объект Python [`bytes`](https://python-all.ru/3.15/library/stdtypes.html#bytes), содержащий неэкранированную строку. В случае ошибки эта функция возвращает `NULL` с установленным исключением.225226Изменено в версии 3.9: *unicode* и *recode\_encoding* теперь не используются.227228# PyBytesWriter229230API [`PyBytesWriter`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytesWriter) можно использовать для создания объекта Python [`bytes`](https://python-all.ru/3.15/library/stdtypes.html#bytes).231232Добавлено в версии 3.15.233234#### `type PyBytesWriter`235236Экземпляр средства записи байтов.237238Этот API **не является потокобезопасным**: writer должен использоваться только одним потоком одновременно.239240Экземпляр должен быть уничтожен с помощью [`PyBytesWriter_Finish()`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytesWriter_Finish) в случае успеха или [`PyBytesWriter_Discard()`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytesWriter_Discard) в случае ошибки.241242## Создание, Завершение, Отмена243244#### `PyBytesWriter *PyBytesWriter_Create(Py_ssize_t size)`245246Создаёт [`PyBytesWriter`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytesWriter) для записи *size* байт.247248Если *size* больше нуля, выделяет *size* байт и устанавливает размер writer в *size*. Вызывающий ответственен за запись *size* байт с помощью [`PyBytesWriter_GetData()`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytesWriter_GetData). Эта функция не выделяет память с запасом.249250При ошибке устанавливает исключение и возвращает `NULL`.251252*size* должен быть положительным или нулевым.253254#### `PyObject *PyBytesWriter_Finish(PyBytesWriter *writer)`255256Завершает объект [`PyBytesWriter`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytesWriter), созданный с помощью [`PyBytesWriter_Create()`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytesWriter_Create).257258При успехе возвращает объект Python [`bytes`](https://python-all.ru/3.15/library/stdtypes.html#bytes). При ошибке устанавливает исключение и возвращает `NULL`.259260После вызова экземпляр writer становится недействительным в любом случае. После [`PyBytesWriter_Finish()`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytesWriter_Finish) никакие API для writer вызывать нельзя.261262#### `PyObject *PyBytesWriter_FinishWithSize(PyBytesWriter *writer, Py_ssize_t size)`263264Аналогично [`PyBytesWriter_Finish()`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytesWriter_Finish), но изменяет размер writer до *size* байт перед созданием объекта [`bytes`](https://python-all.ru/3.15/library/stdtypes.html#bytes).265266#### `PyObject *PyBytesWriter_FinishWithPointer(PyBytesWriter *writer, void *buf)`267268Аналогично [`PyBytesWriter_Finish()`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytesWriter_Finish), но изменяет размер writer с помощью указателя *buf* перед созданием объекта [`bytes`](https://python-all.ru/3.15/library/stdtypes.html#bytes).269270Устанавливает исключение и возвращает `NULL`, если указатель *buf* находится за пределами внутреннего буфера.271272Псевдокод функции:273274```c275Py_ssize_t size = (char*)buf - (char*)PyBytesWriter_GetData(writer);276return PyBytesWriter_FinishWithSize(writer, size);277```278279#### `void PyBytesWriter_Discard(PyBytesWriter *writer)`280281Отменяет объект [`PyBytesWriter`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytesWriter), созданный с помощью [`PyBytesWriter_Create()`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytesWriter_Create).282283Ничего не делает, если *writer* равен `NULL`.284285После вызова экземпляр writer становится недействительным. После [`PyBytesWriter_Discard()`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytesWriter_Discard) никакие API для writer вызывать нельзя.286287## API высокого уровня288289#### `int PyBytesWriter_WriteBytes(PyBytesWriter *writer, const void *bytes, Py_ssize_t size)`290291Увеличивает внутренний буфер *writer* на *size* байт, записывает *size* байт из *bytes* в конец *writer* и добавляет *size* к размеру *writer*.292293Если *size* равно `-1`, вызывает `strlen(bytes)` для получения длины строки.294295При успехе возвращает `0`. При ошибке устанавливает исключение и возвращает `-1`.296297#### `int PyBytesWriter_Format(PyBytesWriter *writer, const char *format, ...)`298299Аналогично [`PyBytes_FromFormat()`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytes_FromFormat), но записывает вывод непосредственно в конец writer. Увеличивает внутренний буфер writer по мере необходимости. Затем добавляет записанный размер к размеру writer.300301При успехе возвращает `0`. При ошибке устанавливает исключение и возвращает `-1`.302303## Геттеры304305#### `Py_ssize_t PyBytesWriter_GetSize(PyBytesWriter *writer)`306307Возвращает размер writer.308309Функция не делает недействительными указатели, возвращённые [`PyBytesWriter_GetData()`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytesWriter_GetData).310311Функция не может завершиться с ошибкой.312313#### `void *PyBytesWriter_GetData(PyBytesWriter *writer)`314315Возвращает данные writer: начало внутреннего буфера.316317Указатель остаётся действительным, пока для *writer* не будет вызвана функция [`PyBytesWriter`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytesWriter), отличная от [`PyBytesWriter_GetData()`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytesWriter_GetData) или [`PyBytesWriter_GetSize()`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytesWriter_GetSize).318319Функция не может завершиться с ошибкой.320321## Низкоуровневый API322323#### `int PyBytesWriter_Resize(PyBytesWriter *writer, Py_ssize_t size)`324325Изменяет размер writer на *size* байт. Может использоваться для увеличения или уменьшения размера writer. Обычно эта функция выделяет память с запасом для обеспечения амортизированной производительности при многократном изменении размера.326327Вновь выделенные байты остаются неинициализированными.328329При успехе возвращает `0`. При ошибке устанавливает исключение и возвращает `-1`.330331*size* должен быть положительным или нулевым.332333#### `int PyBytesWriter_Grow(PyBytesWriter *writer, Py_ssize_t grow)`334335Увеличивает размер writer на *grow* байт от текущего размера. Обычно эта функция выделяет память с запасом для обеспечения амортизированной производительности при многократном изменении размера.336337Вновь выделенные байты остаются неинициализированными.338339При успехе возвращает `0`. При ошибке устанавливает исключение и возвращает `-1`.340341*size* может быть отрицательным для уменьшения writer.342343#### `void *PyBytesWriter_GrowAndUpdatePointer(PyBytesWriter *writer, Py_ssize_t size, void *buf)`344345Аналогично [`PyBytesWriter_Grow()`](https://python-all.ru/3.15/c-api/bytes.html#c.PyBytesWriter_Grow), но также обновляет указатель *buf* .346347Указатель *buf* перемещается, если внутренний буфер перемещается в памяти. Относительное положение *buf* внутри внутреннего буфера остаётся неизменным.348349При ошибке устанавливает исключение и возвращает `NULL`.350351*buf* не должен быть `NULL`.352353Псевдокод функции:354355```c356Py_ssize_t pos = (char*)buf - (char*)PyBytesWriter_GetData(writer);357if (PyBytesWriter_Grow(writer, size) < 0) {358    return NULL;359}360return (char*)PyBytesWriter_GetData(writer) + pos;361```362