2016-07-11 28 views
5

Nach dem Packen einer Ganzzahl in einer Python-Struktur führt das Entpacken zu einem Tupel, auch wenn es nur ein Element enthält. Warum gibt das Entpacken ein Tupel zurück?Warum führt das Entpacken einer Struktur zu einem Tupel?

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

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

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

>>> y 
(1,) 
+2

Wenn die Struktur mehr als ein Element enthält, was geben Sie zurück? Im Allgemeinen ist es am besten, wenn Funktionen nur einen einzigen Typ zurückgeben (so dass der Aufrufer keinen Sonderfall hat, je nachdem, ob es ein oder zwei Elemente gibt oder ...) – mgilson

+0

Ich sehe ... Ist das das einzige/richtige/Pythonic Möglichkeit, ein * int * zu packen/entpacken? – Jedi

+1

In neueren Python-Versionen gibt es 'int.from_bytes' und' int.to_bytes' – mgilson

Antwort

5

Bitte siehe doc erste struct doc

struct.pack (fmt, v1, v2, ...)

Return einen String, der die Werte enthält v1, v2, ... verpackt nach dem angegebenen Format. Die Argumente müssen genau die Werte entsprechen, die vom Format benötigt werden.

-

struct.unpack (fmt, string)

auspacken string (vermutlich durch Pack verpackt (fmt, ...)) entsprechend dem vorgegebenen Format. Das Ergebnis ist ein Tupel , auch wenn es genau ein Element enthält. Die Zeichenkette muss genau die Datenmenge enthalten, die für das Format benötigt wird (len (string) muss gleich calcsize (fmt) sein).

Da struct.pack als struct.pack(fmt, v1, v2, ...) definiert ist. Es akzeptiert eine nicht-keyworded Argumentliste (v1, v2, ..., aka *args), so struct.unpack muss eine Liste wie Objekt, deshalb Tupel zurückgeben.

Es wäre leicht zu verstehen, wenn Sie Pack als

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

Beispiel betrachten:

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

Danke für die Erwähnung. Ich hätte in meiner Frage erwähnen sollen, dass ich das in den Dokumenten gesehen habe. Ich bin mir nicht sicher *** warum *** es gibt ein Tupel obwohl ... – Jedi

+1

@Jedi Ich habe die Antwort aktualisiert, um Details zu erklären – Mithril

1

Denken Sie an einen Anwendungsfall, der unter Verwendung der Sprache C geschrieben Binärdaten lädt. Python kann nicht unterscheiden, ob Binärdaten mit einer Struktur geschrieben wurden oder eine einzelne ganze Zahl verwenden. Also, ich denke, logisch ist es sinnvoll, Tupel immer zurückzugeben, da struct pack and unpack Konvertierungen zwischen Python-Werten und C-Structs durchführt.