2013-05-03 76 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

相关问题