Пожалуйста, смотрите DOC первый struct doc
struct.pack (FMT, v1, v2, ...)
Возвращает строку, содержащую значения v1, v2, ... упакованный в соответствии с данным форматом. Аргументы должны точно соответствовать значениям, необходимым для формата.
-
struct.unpack (FMT, строка)
Распаковка строка (предположительно упаковано пакет (FMT, ...)) в соответствии с заданным форматом. Результатом является кортеж , даже если он содержит ровно один элемент. Строка должна содержать точно объем данных, требуемых форматом (len (string) должен быть равен calcsize (fmt)).
Потому что struct.pack
определяется как struct.pack(fmt, v1, v2, ...)
. Он принимает список аргументов без ключевого слова (v1, v2, ...
, aka *args
), поэтому struct.unpack
нужно вернуть список как объект, вот почему кортеж.
Было бы легко понять, если рассматривать пакет, как
x = struct.pack(fmt, *args)
args = struct.unpack(fmt, x) # return *args
Пример:
>>> x = struct.pack(">i", 1)
>>> struct.unpack(">i", x)
(1,)
>>> x = struct.pack(">iii", 1, 2, 3)
>>> struct.unpack(">iii", x)
(1, 2, 3)
Если структура содержит более одного элемента, то что вы возвращаете? Как правило, лучше всего, если функции возвращают только один тип (поэтому вызывающий объект не имеет специального случая в зависимости от того, есть ли один или два элемента или ...) – mgilson
Я вижу ... Является ли это единственным/правильным/Pythonic способ упаковать/распаковать * int *? – Jedi
В более поздних версиях python есть 'int.from_bytes' и' int.to_bytes' – mgilson