2016-07-11 15 views
5

Po upakowaniu liczby całkowitej w strukturze Pythona, rozpakowywanie kończy się krotką, nawet jeśli zawiera tylko jeden element. Dlaczego rozpakowywanie zwraca krotkę?Dlaczego rozpakowywanie wyniku struct w krotce?

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

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

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

>>> y 
(1,) 
+2

Jeśli struktura zawiera więcej niż jeden przedmiot, to co zwrócisz? Generalnie najlepiej jest, jeśli funkcje zwracają tylko jeden typ (tak, że wywołujący nie musi mieć specjalnego przypadku w zależności od tego, czy jest jeden lub dwa elementy lub ...) – mgilson

+0

Widzę ... Czy to jest jedyne/poprawne/Pythoniczne sposób na spakowanie/rozpakowanie * int *? – Jedi

+1

W nowszych wersjach python znajduje się 'int.from_bytes' oraz' int.to_bytes' – mgilson

Odpowiedz

5

proszę zobaczyć doc pierwszy struct doc

struct.pack (FMT, V1, V2, ...)

Zwraca ciąg zawierający wartości v1, v2, ... pakowane zgodnie z podanym formatem. Argumenty muszą dokładnie odpowiadać wartościom wymaganym przez format.

-

struct.unpack (FMT, string)

Rozpakuj string (przypuszczalnie zapakowane przez paczka (fmt, ...)) zgodnie z podanym formatem. Rezultatem jest krotka , nawet jeśli zawiera dokładnie jeden element. Ciąg musi zawierać dokładnie ilość danych wymaganych przez format (len (ciąg) musi być równy calcsize (fmt)).

Ponieważ struct.pack jest zdefiniowany jako struct.pack(fmt, v1, v2, ...). Przyjmuje listę argumentów niezawierających słów kluczowych (v1, v2, ..., alias *args), , więc struct.unpack musi zwrócić listę obiektów, dlatego krotka.

Byłoby łatwo zrozumieć, jeśli wziąć pod uwagę pakiet jako

x = struct.pack(fmt, *args) 
args = struct.unpack(fmt, x) # return *args 

Przykład:

>>> 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

Dzięki za wzmiankę o tym. Powinienem wspomnieć w moim pytaniu, że widziałem to w dokumentach. Nie jestem pewien *** dlaczego *** to zwraca krotkę ... – Jedi

+1

@Jedi Mam zaktualizowaną odpowiedź, aby wyjaśnić szczegóły – Mithril

1

myśleć o przypadku użycia, który ładuje dane binarne napisane przy użyciu języka C. Python nie będzie w stanie odróżnić, czy dane binarne zostały zapisane przy użyciu struktury lub jednej liczby całkowitej. Myślę więc, że logiczne jest, aby zawsze zwracać krotkę, ponieważ struct pack i unpack dokonują konwersji między wartościami Pythona i C-strukturami.

Powiązane problemy