我想将列表中的所有数据打包到单个缓冲区中以通过UDP套接字发送。列表相对较长,因此索引列表中的每个元素都很繁琐。这就是我到目前为止所做的:
NumElements = len(data)
buf = struct.pack('d'*NumElements,data[0],data[1],data[2],data[3],data[4])
但我想做更多pythonic的事情,如果我在列表中添加更多元素,则不需要更改调用...类似于:
NumElements = len(data)
buf = struct.pack('d'*NumElements,data) # Returns error
这样做有好办法吗?
答案 0 :(得分: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编写函数调用以从列表或元组中解压缩参数...
答案 1 :(得分:1)
struct.pack(...)
和struct.unpack(...)
的格式字符串允许在类型前面传递数字(表示计数),这意味着序列化数据中预期存在的特定类型是多少次: / p>
简单案例
data = [1.2, 3.4, 5.6]
struct.pack('3d', data[0], data[1], data[2])
struct.pack('3d', *[1.2, 3.4, 5.6])
或更笼统地说:
data = [1.0, 1.234, 1.9, 3.14, 6.002, 7.4, 9.2]
struct.pack('{}d'.format(len(data)), *data)