2016-07-11 3 views
5

После упаковки целого в структуру Python распаковка результатов в кортеж, даже если он содержит только один элемент. Почему распаковка возвращает кортеж?Почему распаковка результата структуры в кортеж?

>>> x = struct.pack(">i",1) 

>>> str(x) 
'\x00\x00\x00\x01' 

>>> y = struct.unpack(">i",x) 

>>> y 
(1,) 
+2

Если структура содержит более одного элемента, то что вы возвращаете? Как правило, лучше всего, если функции возвращают только один тип (поэтому вызывающий объект не имеет специального случая в зависимости от того, есть ли один или два элемента или ...) – mgilson

+0

Я вижу ... Является ли это единственным/правильным/Pythonic способ упаковать/распаковать * int *? – Jedi

+1

В более поздних версиях python есть 'int.from_bytes' и' int.to_bytes' – mgilson

ответ

5

Пожалуйста, смотрите 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) 
+0

Спасибо, что упомянули об этом. Я должен был упомянуть в своем вопросе, что видел это в документах. Я не уверен *** почему *** он возвращает кортеж, хотя ... – Jedi

+1

@Jedi Я обновил ответ, чтобы объяснить подробности – Mithril

1

Придумайте прецеденте, который загружает двоичные данные, записанные с использованием языка C. Python не сможет отличить, если бинарные данные были написаны с использованием структуры или с использованием одного целого. Поэтому, я думаю, логически имеет смысл возвращать кортеж всегда, поскольку struct pack и unpack выполняют преобразования между значениями Python и C structs.

Смежные вопросы