为什么解包结构体会得到一个元组?

13

在 Python 结构体中打包整数后,即使它只包含一个项目,解包的结果也是一个元组。为什么解包会返回一个元组?

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

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

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

>>> y
(1,)

2
如果结构体包含多个项,那么你应该返回什么?通常最好的做法是函数只返回单一类型(这样调用者就不必根据是否有一个或两个等情况特殊处理)。 - mgilson
我明白了... 这是打包/解包 int 的唯一/正确/Pythonic 方式吗? - Jedi
1
在较新的Python版本中,有int.from_bytesint.to_bytes - mgilson
2个回答

10

请先查看文档 struct 文档

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

根据给定的格式,将 v1、v2 等值打包为一个字符串返回。参数必须与格式所需的值完全匹配。

--

struct.unpack(fmt, string)

按照给定的格式解包字符串(可能是通过 pack(fmt, ...) 打包的)。即使结果只包含一个元素,结果也是一个元组。字符串必须恰好包含格式所需的数据量(len(string) 必须等于 calcsize(fmt))。

因为 struct.pack 定义为 struct.pack(fmt, v1, v2, ...),它接受一个非关键字的参数列表 (v1, v2, ..., 也就是 *args),所以 struct.unpack 需要返回一个类似于列表的对象,这就是为什么返回元组。

如果你将 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)

1
谢谢你提到了这个。我应该在我的问题中提到我在文档中看到过这个。但我不确定为什么它会返回一个元组... - Jedi

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接