struct.md
1> **Источник:** https://python-all.ru/3.14/library/struct.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# `struct` – Интерпретация байтов как упакованных двоичных данных89**Исходный код:** [Lib/struct.py](https://python-all.ru/src/3.14/Lib/struct.py)1011---1213Этот модуль преобразует значения Python в C-структуры, представленные как объекты [`bytes`](https://python-all.ru/3.14/library/stdtypes.html#bytes) Python, и обратно. Компактные [строки формата](https://python-all.ru/3.14/library/struct.html#struct-format-strings) описывают предполагаемые преобразования значений Python. Функции и объекты модуля могут использоваться для двух в значительной степени разных задач: обмена данными с внешними источниками (файлами или сетевыми соединениями) или передачи данных между приложением Python и уровнем C.1415> **Примечание**16>17> Если символ префикса не указан, по умолчанию используется собственный (native) режим. Он упаковывает или распаковывает данные в зависимости от платформы и компилятора, на которых был собран интерпретатор Python. Результат упаковки заданной C-структуры содержит выравнивающие байты (pad bytes), которые обеспечивают правильное выравнивание для используемых типов C; аналогично, при распаковке учитывается выравнивание. В отличие от этого, при обмене данными с внешними источниками программист отвечает за определение порядка байтов и заполнения между элементами. Подробнее см. [Порядок байтов, размер и выравнивание](https://python-all.ru/3.14/library/struct.html#struct-alignment).1819Некоторые функции `struct` (и методы [`Struct`](https://python-all.ru/3.14/library/struct.html#struct.Struct)) принимают аргумент *buffer* (буфер). Он ссылается на объекты, реализующие [протокол буфера](https://python-all.ru/3.14/c-api/buffer.html#bufferobjects) и предоставляющие буфер для чтения или чтения-записи. Наиболее распространённые типы, используемые для этой цели, – [`bytes`](https://python-all.ru/3.14/library/stdtypes.html#bytes) и [`bytearray`](https://python-all.ru/3.14/library/stdtypes.html#bytearray), но многие другие типы, которые можно рассматривать как массив байтов, реализуют протокол буфера, поэтому их можно читать/заполнять без дополнительного копирования из объекта `bytes`.2021## Функции и исключения2223Модуль определяет следующие исключения и функции:2425#### `exception struct.error`2627Исключение, вызываемое в различных ситуациях; аргумент – строка, описывающая, что не так.2829#### `struct.pack(format, v1, v2, ...)`3031Возвращает объект bytes, содержащий значения *v1*, *v2*, …, упакованные в соответствии со строкой формата *format*. Аргументы должны точно соответствовать значениям, требуемым форматом.3233#### `struct.pack_into(format, buffer, offset, v1, v2, ...)`3435Упаковывает значения *v1*, *v2*, … в соответствии со строкой формата *format* и записывает упакованные байты в буфер *buffer*, начиная с позиции *offset*. Обратите внимание, что *offset* – обязательный аргумент.3637#### `struct.unpack(format, buffer)`3839Распаковывает из буфера *buffer* (предположительно упакованного с помощью `pack(format, ...)`) в соответствии со строкой формата *format*. Результат – кортеж, даже если он содержит ровно один элемент. Размер буфера в байтах должен соответствовать размеру, требуемому форматом, отражённому [`calcsize()`](https://python-all.ru/3.14/library/struct.html#struct.calcsize).4041#### `struct.unpack_from(format, /, buffer, offset=0)`4243Распаковывает из *buffer*, начиная с позиции *offset*, в соответствии со строкой формата *format*. Результат – кортеж, даже если он содержит ровно один элемент. Размер буфера в байтах, начиная с позиции *offset*, должен быть не меньше размера, требуемого форматом, отражённого [`calcsize()`](https://python-all.ru/3.14/library/struct.html#struct.calcsize).4445#### `struct.iter_unpack(format, buffer)`4647Итеративно распаковывает из буфера *buffer* в соответствии со строкой формата *format*. Эта функция возвращает итератор, который будет читать из буфера блоки одинакового размера, пока всё его содержимое не будет израсходовано. Размер буфера в байтах должен быть кратен размеру, требуемому форматом, отражённому [`calcsize()`](https://python-all.ru/3.14/library/struct.html#struct.calcsize).4849Каждая итерация возвращает кортеж, как указано в строке формата.5051Добавлено в версии 3.4.5253#### `struct.calcsize(format)`5455Возвращает размер структуры (и, следовательно, объекта bytes, полученного с помощью `pack(format, ...)`), соответствующий строке формата *format*.5657## Строки формата5859Строки формата описывают расположение данных при упаковке и распаковке. Они состоят из [символов формата](https://python-all.ru/3.14/library/struct.html#format-characters), которые определяют тип упаковываемых/распаковываемых данных. Кроме того, специальные символы управляют [порядком байтов, размером и выравниванием](https://python-all.ru/3.14/library/struct.html#struct-alignment). Каждая строка формата состоит из необязательного символа префикса, описывающего общие свойства данных, и одного или нескольких символов формата, описывающих фактические значения данных и заполнение.6061### Порядок байтов, размер и выравнивание6263По умолчанию типы C представляются в собственном формате и порядке байтов машины и правильно выравниваются с пропуском выравнивающих байтов при необходимости (в соответствии с правилами, используемыми компилятором C). Такое поведение выбрано, чтобы байты упакованной структуры точно соответствовали расположению в памяти соответствующей структуры C. Выбор между использованием собственного порядка байтов и выравнивания или стандартных форматов зависит от приложения.6465В качестве альтернативы, первый символ строки формата может использоваться для указания порядка байтов, размера и выравнивания упакованных данных, как показано в следующей таблице:6667| Символ | Порядок байтов | Размер | Выравнивание |68| --- | --- | --- | --- |69| `@` | собственный | собственный | собственный |70| `=` | собственный | стандартный | нет |71| `<` | little-endian | стандартный | нет |72| `>` | big-endian | стандартный | нет |73| `!` | сетевой порядок байт (= big-endian) | стандартный | нет |7475Если первый символ не один из этих, предполагается `'@'`.7677> **Примечание**78>79> Число 1023 (`0x3ff` в шестнадцатеричной системе) имеет следующие представления в байтах:80>81> - `03 ff` в big-endian (`>`)82> - `ff 03` в little-endian (`<`)83>84> Пример на Python:85>86> ```python87> >>> import struct88> >>> struct.pack('>h', 1023)89> b'\x03\xff'90> >>> struct.pack('<h', 1023)91> b'\xff\x03'92> ```9394Собственный порядок байт может быть big-endian или little-endian в зависимости от системы. Например, Intel x86, AMD64 (x86-64) и Apple M1 используют little-endian; IBM z и многие устаревшие архитектуры – big-endian. Используйте [`sys.byteorder`](https://python-all.ru/3.14/library/sys.html#sys.byteorder) для проверки порядка байт вашей системы.9596Собственный размер и выравнивание определяются с помощью выражения `sizeof` компилятора C. Это всегда используется вместе с собственным порядком байт.9798Стандартный размер зависит только от символа формата; см. таблицу в разделе [Символы формата](https://python-all.ru/3.14/library/struct.html#format-characters).99100Обратите внимание на различие между `'@'` и `'='`: оба используют собственный порядок байт, но размер и выравнивание второго стандартизированы.101102Форма `'!'` представляет сетевой порядок байт, который всегда является big-endian, как определено в [IETF RFC 1700](https://python-all.ru/3.14/library/struct.html).103104Нет способа указать несобственный порядок байт (принудительную перестановку байт); используйте соответствующий выбор из `'<'` или `'>'`.105106Примечания:1071081. Заполнение автоматически добавляется только между последовательными членами структуры. Начало и конец закодированной структуры не дополняются.1092. Заполнение не добавляется при использовании несобственного размера и выравнивания, например, с ‘\<’, ‘\>’, ‘=’ и ‘!’.1103. Чтобы выровнять конец структуры по требованию выравнивания конкретного типа, завершите формат кодом этого типа с нулевым количеством повторений. См. [Примеры](https://python-all.ru/3.14/library/struct.html#struct-examples).111112### Символы формата113114Символы формата имеют следующее значение; преобразование между значениями C и Python должно быть очевидным, исходя из их типов. Столбец «Стандартный размер» указывает размер упакованного значения в байтах при использовании стандартного размера; то есть когда строка формата начинается с одного из `'<'`, `'>'`, `'!'` или `'='`. При использовании собственного размера размер упакованного значения зависит от платформы.115116| Формат | Тип C | Тип Python | Стандартный размер | Примечания |117| --- | --- | --- | --- | --- |118| `x` | байт заполнения | нет значения | | (7) |119| `c` | char | строка байт длиной 1 | 1 | |120| `b` | signed char | int | 1 | (2) |121| `B` | unsigned char | int | 1 | (2) |122| `?` | \_Bool | bool | 1 | (1) |123| `h` | short | int | 2 | (2) |124| `H` | unsigned short | int | 2 | (2) |125| `i` | int | int | 4 | (2) |126| `I` | unsigned int | int | 4 | (2) |127| `l` | long | int | 4 | (2) |128| `L` | unsigned long | int | 4 | (2) |129| `q` | long long | int | 8 | (2) |130| `Q` | unsigned long long | int | 8 | (2) |131| `n` | `ssize_t` | int | | (2), (3) |132| `N` | `size_t` | int | | (2), (3) |133| `e` | \_Float16 | float | 2 | (4), (6) |134| `f` | float | float | 4 | (4) |135| `d` | double | float | 8 | (4) |136| `F` | float complex | комплексное число | 8 | (10) |137| `D` | double complex | комплексное число | 16 | (10) |138| `s` | char\[\] | bytes | | (9) |139| `p` | char\[\] | bytes | | (8) |140| `P` | void\* | int | | (2), (5) |141142Изменено в версии 3.3: Добавлена поддержка форматов `'n'` и `'N'`.143144Изменено в версии 3.6: Добавлена поддержка формата `'e'`.145146Изменено в версии 3.14: Добавлена поддержка форматов `'F'` и `'D'`.147148> **См. также**149>150> Модули [`array`](https://python-all.ru/3.14/library/array.html#module-array) и [ctypes](https://python-all.ru/3.14/library/ctypes.html#ctypes-fundamental-data-types), а также сторонние модули, такие как [numpy](https://python-all.ru/3.14/library/struct.html), используют похожие, но немного отличающиеся коды типов.151152Примечания:1531541. Код преобразования `'?'` соответствует типу \_Bool, определённому стандартами C начиная с C99. В стандартном режиме он представляется одним байтом.1552. При попытке упаковать нецелое число с использованием любого из кодов преобразования целых чисел, если нецелое число имеет метод [`__index__()`](https://python-all.ru/3.14/reference/datamodel.html#object.__index__), то этот метод вызывается для преобразования аргумента в целое число перед упаковкой.156157 Изменено в версии 3.2: Добавлено использование метода [`__index__()`](https://python-all.ru/3.14/reference/datamodel.html#object.__index__) для нецелых чисел.1583. Коды преобразования `'n'` и `'N'` доступны только для родного размера (выбранного по умолчанию или с символом порядка байтов `'@'`). Для стандартного размера можно использовать любой из других целочисленных форматов, который подходит для приложения.1594. Для кодов преобразования `'f'`, `'d'` и `'e'` упакованное представление использует форматы IEEE 754 binary32, binary64 или binary16 (для `'f'`, `'d'` или `'e'` соответственно), независимо от формата чисел с плавающей запятой, используемого платформой.1605. Символ формата `'P'` доступен только для родного порядка байтов (выбранного по умолчанию или с символом порядка байтов `'@'`). Символ порядка байтов `'='` выбирает порядок little- или big-endian в зависимости от хост-системы. Модуль struct не интерпретирует это как родной порядок, поэтому формат `'P'` недоступен.1616. Тип IEEE 754 binary16 «половинной точности» был введён в редакции 2008 года стандарта [IEEE 754](https://python-all.ru/3.14/library/struct.html). Он имеет знаковый бит, 5-битную экспоненту и 11-битную точность (с 10 явно хранимыми битами), и может представлять числа от примерно `6.1e-05` до `6.5e+04` с полной точностью. Этот тип не широко поддерживается компиляторами C: он доступен как тип \_Float16, если компилятор поддерживает Приложение H стандарта C23. На типичной машине для хранения можно использовать unsigned short, но не для математических операций. См. страницу Википедии о [формате половинной точности с плавающей запятой](https://python-all.ru/3.14/library/struct.html) для получения дополнительной информации.1627. При упаковке `'x'` вставляет один нулевой байт (NUL).1638. Символ формата `'p'` кодирует «строку Паскаля», то есть короткую строку переменной длины, хранящуюся в *фиксированном количестве байтов*, заданном счётчиком. Первым сохраняется байт длины строки или 255, в зависимости от того, что меньше. Затем идут байты строки. Если байтовая строка, переданная в [`pack()`](https://python-all.ru/3.14/library/struct.html#struct.pack), слишком длинная (длиннее, чем счётчик минус 1), сохраняются только первые `count-1` байтов строки. Если байтовая строка короче `count-1`, она дополняется нулевыми байтами, чтобы было использовано ровно count байтов. Обратите внимание, что для [`unpack()`](https://python-all.ru/3.14/library/struct.html#struct.unpack) символ формата `'p'` потребляет `count` байтов, но возвращаемый объект `bytes` никогда не может содержать более 255 байтов. При упаковке принимаются аргументы типов [`bytes`](https://python-all.ru/3.14/library/stdtypes.html#bytes) и [`bytearray`](https://python-all.ru/3.14/library/stdtypes.html#bytearray).1649. Для символа формата `'s'` счётчик интерпретируется как длина байтовой строки, а не как количество повторений, как для других символов формата; например, `'10s'` означает одну строку из 10 байт, отображаемую в или из одного байтового объекта Python, тогда как `'10c'` означает 10 отдельных однобайтовых символьных элементов (например, `cccccccccc`), отображаемых в или из десяти разных байтовых объектов Python. (См. [Примеры](https://python-all.ru/3.14/library/struct.html#struct-examples) для конкретной демонстрации различия.) Если счётчик не указан, по умолчанию он равен 1. При упаковке байтовая строка усекается или дополняется нулевыми байтами по необходимости, чтобы она подошла. При распаковке результирующий объект `bytes` всегда имеет ровно указанное количество байт. Как частный случай, `'0s'` означает одну пустую байтовую строку (в то время как `'0c'` означает 0 символов). При упаковке принимаются аргументы типов [`bytes`](https://python-all.ru/3.14/library/stdtypes.html#bytes) и [`bytearray`](https://python-all.ru/3.14/library/stdtypes.html#bytearray).16510. Для символов формата `'F'` и `'D'` упакованное представление использует форматы IEEE 754 binary32 и binary64 для компонентов комплексного числа, независимо от формата чисел с плавающей запятой, используемого платформой. Обратите внимание, что комплексные типы (`F` и `D`) доступны безусловно, несмотря на то, что комплексные типы являются опциональной возможностью в C. Как указано в стандарте C11, каждый комплексный тип представлен массивом из двух элементов C, содержащим соответственно действительную и мнимую части.166167Символу формата может предшествовать целочисленный счётчик повторений. Например, строка формата `'4h'` означает то же самое, что и `'hhhh'`.168169Пробельные символы между форматами игнорируются; однако счётчик и его формат не должны содержать пробелов.170171При упаковке значения `x` с использованием одного из целочисленных форматов (`'b'`, `'B'`, `'h'`, `'H'`, `'i'`, `'I'`, `'l'`, `'L'`, `'q'`, `'Q'`), если `x` выходит за допустимый диапазон для этого формата, то вызывается [`struct.error`](https://python-all.ru/3.14/library/struct.html#struct.error).172173Изменено в версии 3.1: Ранее некоторые из целочисленных форматов выполняли перенос значений за диапазон и вызывали [`DeprecationWarning`](https://python-all.ru/3.14/library/exceptions.html#DeprecationWarning) вместо [`struct.error`](https://python-all.ru/3.14/library/struct.html#struct.error).174175Для символа формата `'?'` возвращаемое значение – [`True`](https://python-all.ru/3.14/library/constants.html#True) или [`False`](https://python-all.ru/3.14/library/constants.html#False). При упаковке используется истинностное значение объекта-аргумента. Будет упакован либо 0, либо 1 в родном или стандартном представлении bool, и любое ненулевое значение будет `True` при распаковке.176177### Примеры178179> **Примечание**180>181> Примеры с родным порядком байтов (обозначенным префиксом формата `'@'` или отсутствием какого-либо символа префикса) могут не совпадать с тем, что выдаёт машина читателя, так как это зависит от платформы и компилятора.182183Упакуйте и распакуйте целые числа трёх разных размеров, используя порядок big endian:184185```python186>>> from struct import *187>>> pack(">bhl", 1, 2, 3)188b'\x01\x00\x02\x00\x00\x00\x03'189>>> unpack('>bhl', b'\x01\x00\x02\x00\x00\x00\x03')190(1, 2, 3)191>>> calcsize('>bhl')1927193```194195Попытка упаковать целое число, которое слишком велико для заданного поля:196197```python198>>> pack(">h", 99999)199Traceback (most recent call last):200 File "<stdin>", line 1, in <module>201struct.error: 'h' format requires -32768 <= number <= 32767202```203204Демонстрация различия между символами формата `'s'` и `'c'`:205206```python207>>> pack("@ccc", b'1', b'2', b'3')208b'123'209>>> pack("@3s", b'123')210b'123'211```212213Распакованные поля можно именовать, присваивая их переменным или оборачивая результат в именованный кортеж:214215```python216>>> record = b'raymond \x32\x12\x08\x01\x08'217>>> name, serialnum, school, gradelevel = unpack('<10sHHb', record)218219>>> from collections import namedtuple220>>> Student = namedtuple('Student', 'name serialnum school gradelevel')221>>> Student._make(unpack('<10sHHb', record))222Student(name=b'raymond ', serialnum=4658, school=264, gradelevel=8)223```224225Порядок символов формата может влиять на размер в собственном режиме, поскольку выравнивание подразумевается автоматически. В стандартном режиме пользователь отвечает за вставку любого необходимого выравнивания. Обратите внимание: в первом вызове `pack` ниже после упаковки `'#'` были добавлены три нулевых байта, чтобы выровнять следующее целое число по границе четырёх байт. В этом примере вывод был получен на машине с порядком от младшего к старшему:226227```python228>>> pack('@ci', b'#', 0x12131415)229b'#\x00\x00\x00\x15\x14\x13\x12'230>>> pack('@ic', 0x12131415, b'#')231b'\x15\x14\x13\x12#'232>>> calcsize('@ci')2338234>>> calcsize('@ic')2355236```237238Следующая строка формата `'llh0l'` приводит к добавлению двух байт выравнивания в конце, если предполагается, что длинные целые платформы выровнены по 4-байтовым границам:239240```python241>>> pack('@llh0l', 1, 2, 3)242b'\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00'243```244245> **См. также**246>247> **Модуль [`array`](https://python-all.ru/3.14/library/array.html#module-array)**248>249> Упакованное бинарное хранение однородных данных.250>251> **Модуль [`json`](https://python-all.ru/3.14/library/json.html#module-json)**252>253> Кодировщик и декодировщик JSON.254>255> **Модуль [`pickle`](https://python-all.ru/3.14/library/pickle.html#module-pickle)**256>257> Сериализация объектов Python.258259## Применения260261Существуют два основных применения модуля `struct`: обмен данными между Python и кодом C внутри приложения или другого приложения, скомпилированного с тем же компилятором ([собственные форматы](https://python-all.ru/3.14/library/struct.html#struct-native-formats)), и обмен данными между приложениями по согласованной схеме размещения данных ([стандартные форматы](https://python-all.ru/3.14/library/struct.html#struct-standard-formats)). В общем случае строки формата, построенные для этих двух областей, различаются.262263### Собственные форматы264265При построении строк формата, имитирующих собственное размещение, компилятор и архитектура машины определяют порядок байт и выравнивание. В таких случаях следует использовать символ формата `@`, чтобы указать собственный порядок байт и размеры данных. Внутренние байты выравнивания обычно вставляются автоматически. Возможно, потребуется код формата с нулевым повторением в конце строки формата для округления до правильной байтовой границы для корректного выравнивания последовательных блоков данных.266267Рассмотрим два простых примера (на 64-битной машине с порядком от младшего к старшему):268269```python270>>> calcsize('@lhl')27124272>>> calcsize('@llh')27318274```275276Данные не выравниваются по 8-байтовой границе в конце второй строки формата без использования дополнительного выравнивания. Код формата с нулевым повторением решает эту проблему:277278```python279>>> calcsize('@llh0l')28024281```282283Код формата `'x'` можно использовать для указания повторения, но для собственных форматов лучше использовать код с нулевым повторением, например `'0l'`.284285По умолчанию используется собственный порядок байт и выравнивание, но лучше указывать это явно с помощью префиксного символа `'@'`.286287### Стандартные форматы288289При обмене данными за пределами процесса, например по сети или при хранении, будьте точны. Укажите точный порядок байт, размер и выравнивание. Не предполагайте, что они совпадают с собственным порядком конкретной машины. Например, сетевой порядок байт – от старшего к младшему, в то время как многие популярные ЦП используют порядок от младшего к старшему. Явно определяя это, пользователю не нужно заботиться об особенностях платформы, на которой выполняется его код. Первым символом обычно должен быть `<` или `>` (или `!`). Выравнивание – ответственность программиста. Код формата с нулевым повторением не работает. Вместо этого пользователь должен явно добавлять байты выравнивания `'x'` там, где это необходимо. Возвращаясь к примерам из предыдущего раздела:290291```python292>>> calcsize('<qh6xq')29324294>>> pack('<qh6xq', 1, 2, 3) == pack('@lhl', 1, 2, 3)295True296>>> calcsize('@llh')29718298>>> pack('@llh', 1, 2, 3) == pack('<qqh', 1, 2, 3)299True300>>> calcsize('<qqh6x')30124302>>> calcsize('@llh0l')30324304>>> pack('@llh0l', 1, 2, 3) == pack('<qqh6x', 1, 2, 3)305True306```307308Приведённые выше результаты (полученные на 64-битной машине) не гарантированно совпадут при выполнении на разных машинах. Например, примеры ниже были выполнены на 32-битной машине:309310```python311>>> calcsize('<qqh6x')31224313>>> calcsize('@llh0l')31412315>>> pack('@llh0l', 1, 2, 3) == pack('<qqh6x', 1, 2, 3)316False317```318319## Классы320321Модуль `struct` также определяет следующий тип:322323#### `class struct.Struct(format)`324325Возвращает новый объект Struct, который читает и записывает двоичные данные в соответствии со строкой формата *format*. Создание объекта `Struct` однократно и вызов его методов эффективнее, чем вызов функций уровня модуля с тем же форматом, поскольку строка формата компилируется только один раз.326327> **Примечание**328>329> Скомпилированные версии последних строк формата, переданных функциям уровня модуля, кэшируются, поэтому программы, использующие лишь несколько строк формата, могут не беспокоиться о повторном использовании одного экземпляра `Struct`.330331Скомпилированные объекты Struct поддерживают следующие методы и атрибуты:332333#### `pack(v1, v2, ...)`334335Идентично функции [`pack()`](https://python-all.ru/3.14/library/struct.html#struct.pack), использует скомпилированный формат. (`len(result)` будет равно [`size`](https://python-all.ru/3.14/library/struct.html#struct.Struct.size).)336337#### `pack_into(buffer, offset, v1, v2, ...)`338339Идентично функции [`pack_into()`](https://python-all.ru/3.14/library/struct.html#struct.pack_into), использует скомпилированный формат.340341#### `unpack(buffer)`342343Идентично функции [`unpack()`](https://python-all.ru/3.14/library/struct.html#struct.unpack), использует скомпилированный формат. Размер буфера в байтах должен быть равен [`size`](https://python-all.ru/3.14/library/struct.html#struct.Struct.size).344345#### `unpack_from(buffer, offset=0)`346347Идентично функции [`unpack_from()`](https://python-all.ru/3.14/library/struct.html#struct.unpack_from), использует скомпилированный формат. Размер буфера в байтах, начиная с позиции *offset*, должен быть не менее [`size`](https://python-all.ru/3.14/library/struct.html#struct.Struct.size).348349#### `iter_unpack(buffer)`350351Идентично функции [`iter_unpack()`](https://python-all.ru/3.14/library/struct.html#struct.iter_unpack), использует скомпилированный формат. Размер буфера в байтах должен быть кратен [`size`](https://python-all.ru/3.14/library/struct.html#struct.Struct.size).352353Добавлено в версии 3.4.354355#### `format`356357Строка форматирования, используемая для создания этого объекта Struct.358359Изменено в версии 3.7: Тип строки форматирования теперь [`str`](https://python-all.ru/3.14/library/stdtypes.html#str) вместо [`bytes`](https://python-all.ru/3.14/library/stdtypes.html#bytes).360361#### `size`362363Вычисленный размер структуры (и, следовательно, объекта bytes, создаваемого методом [`pack()`](https://python-all.ru/3.14/library/struct.html#struct.pack)), соответствующий [`format`](https://python-all.ru/3.14/library/functions.html#format).364365Изменено в версии 3.13: *repr()* структур изменилась. Теперь оно:366367```python368>>> Struct('i')369Struct('i')370```371