13

我想将列表中的所有数据打包到一个缓冲区中,以通过 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

有没有这样做的好方法?

4

2 回答 2

15

是的,您可以使用*args调用语法。

而不是这个:

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

… 做这个:

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

请参阅教程中的解包参数列表。(但实际上,请阅读第 4.7 节的所有内容,而不仅仅是 4.7.4,否则您将不知道“相反的情况……”指的是什么……)简要地说:

...当参数已经在列表或元组中,但需要为需要单独位置参数的函数调用解包时...使用 *-operator 编写函数调用以将参数从列表或元组中解包...</p>

于 2013-05-03T22:09:33.400 回答
1

struct.pack(...)和允许在类型前面传递数字(表示计数)的格式字符串,struct.unpack(...)表示特定类型预期在序列化数据中出现的次数:

简单案例

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)
于 2018-10-18T10:26:41.580 回答