2013-05-03 17 views
13

Vorrei impacchettare tutti i dati in un elenco in un buffer singolo da inviare tramite un socket UDP. L'elenco è relativamente lungo, quindi l'indicizzazione di ciascun elemento nell'elenco è noiosa. Questo è quello che ho finora:Python struct.pack() per i singoli elementi in una lista?

NumElements = len(data) 
buf = struct.pack('d'*NumElements,data[0],data[1],data[2],data[3],data[4]) 

Ma mi piacerebbe fare qualcosa di più divinatorio che non richiede cambio la chiamata se ho aggiunto più elementi alla lista ... qualcosa come:

NumElements = len(data) 
buf = struct.pack('d'*NumElements,data) # Returns error 

C'è un buon modo per farlo ??

risposta

15

Sì, è possibile utilizzare la sintassi di chiamata *args.

Invece di questo:

buf = struct.pack('d'*NumElements,data) # Returns error 

... fare questo:

buf = struct.pack('d'*NumElements, *data) # Works 

Vedi Unpacking Argument Lists nel tutorial. (Ma davvero, leggi tutto della sezione 4.7, non solo 4.7.4, o non saprai cosa "La situazione inversa ..." si riferisce a ...) In breve:

... quando gli argomenti sono già in un lista o tupla, ma hanno bisogno di essere decompressi per una chiamata di funzione che richiede argomenti posizionali separati ... scrivere la chiamata di funzione con l'* -operator per decomprimere gli argomenti di una lista o tupla ...

+0

Ah questo è solo quello che mi serviva! Grazie! – user1636547

+1

''d' * NumElements' non è una buona pratica, potrebbe finire per fare una stringa molto grande, solo per perdere tempo a cercare, solo per liberare in seguito. Includere invece il numero direttamente nella stringa: 'buf = struct.pack (" {0: d} d ".format (NumElements), * data)' – ideasman42

+0

@ ideasman42: buon punto. Ma con un numero enorme di valori, scompattarli in 500000 argomenti potrebbe essere un problema tanto quanto passare 'd' * 500000, quindi potresti voler testarlo contro 'b ''. Join (struct.pack ('d' , elem) per elem in data) ', o considera l'uso di qualcosa come' array' o 'ctypes' invece di' struct'. – abarnert

Problemi correlati