【问题标题】:Why does unpacking a struct result in a tuple?为什么解压结构会产生一个元组?
【发布时间】:2016-11-12 20:50:46
【问题描述】:

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

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

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

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

>>> y
(1,)

【问题讨论】:

  • 如果结构包含多个项目,那么你返回什么?一般来说,函数最好只返回一种类型(因此调用者不必根据是一个项目还是两个项目或......)
  • 我明白了...这是打包/解包 int 的唯一/正确/Pythonic 方式吗?
  • 在最近的python版本中有int.from_bytesint.to_bytes

标签: python struct tuples pack unpack


【解决方案1】:

请先看文档struct doc

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)

【讨论】:

  • 感谢您提及。我应该在我的问题中提到我在文档中看到了这一点。我不确定 why 虽然它返回一个元组......
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 2014-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多