2013-05-03 114 views
13

我想將列表中的所有數據打包到單個緩衝區中以通過UDP套接字發送。該列表相對較長,因此索引列表中的每個元素都很乏味。這是我到目前爲止有:python struct.pack()列表中的單個元素?

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

但是我希望做更多的東西,不需要我改變呼叫,如果我加入了更多元素添加到列表...像Python的:

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

有沒有這樣做的好方法?

回答

15

是的,您可以使用*args調用語法。

取而代之的是:

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

...這樣做:

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

Unpacking Argument Lists教程。 (但實際上,請閱讀第4.7節中的所有內容,而不僅僅是4.7.4,否則您將不知道「相反情況......」是指...)簡而言之:

...當參數已經在列表或元組,但需要解壓縮以獲取需要單獨位置參數的函數調用...使用* -operator寫入函數調用以將參數從列表或元組中解開...

+0

啊,那正是我需要的!謝謝! – user1636547 2013-05-04 00:26:54

+1

''d'* NumElements'不是很好的做法,它可能會產生一個非常大的字符串,只能浪費時間解析,只能在事後釋放。而是直接在字符串中包含數字:'buf = struct.pack(「{0:d} d」.format(NumElements),* data)' – ideasman42 2015-04-28 19:38:53

+0

@ ideasman42:好點。但是對於大量的值,將它們解包爲500000個參數可能與傳遞'd'* 500000一樣多,所以您可能需要對'b''進行測試。join(struct.pack('d' ,elem)for elem in data),或者考慮使用'array'或'ctypes'而不是'struct'。 – abarnert 2015-04-28 21:16:23

相關問題