为什么解包结构会产生元组?

Why does unpacking a struct result in a tuple?

在 Python 结构中打包一个整数后,解包会生成一个元组,即使它只包含一个项目。为什么解包 return 一个元组?

>>> x = struct.pack(">i",1)

>>> str(x)
'\x00\x00\x00\x01'

>>> y = struct.unpack(">i",x)

>>> y
(1,)

请先看文档struct doc

struct.pack(fmt, v1, v2, ...)

Return a string containing the values v1, v2, ... packed according to the given format. The arguments must match the values required by the format exactly.

--

struct.unpack(fmt, string)

Unpack the string (presumably packed by pack(fmt, ...)) according to the given format. The result is a tuple even if it contains exactly one item. The string must contain exactly the amount of data required by the format (len(string) must equal calcsize(fmt)).

因为 struct.pack 定义为 struct.pack(fmt, v1, v2, ...)。 它接受一个非关键字参数列表(v1, v2, ...,又名 *args), 所以 struct.unpack 需要 return 像对象这样的列表,这就是元组的原因。

如果把pack看成

就容易理解了
x = struct.pack(fmt, *args)
args = struct.unpack(fmt, x)  # return *args

示例:

>>> x = struct.pack(">i", 1)
>>> struct.unpack(">i", x)
(1,)
>>> x = struct.pack(">iii", 1, 2, 3)
>>> struct.unpack(">iii", x)
(1, 2, 3)

考虑一个加载使用 C 语言编写的二进制数据的用例。 Python 将无法区分二进制数据是使用结构还是使用单个整数写入的。所以,我认为,从逻辑上讲,return 元组总是有意义的,因为 struct pack 和 unpack 执行 Python 值和 C 结构之间的转换。