You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python2迁移Python3:apply调用struct.pack报错的正确解决方法

问题原因
  • 替换apply为*解包的语法本身是正确的,报错核心原因是value的计算结果为浮点数类型:Python 2的struct.pack接收H(无符号短整型)格式符参数时,会自动将浮点数隐式转换为整数;但Python 3要求必须显式传入整数,不会做隐式转换,因此抛出类型错误。
  • 次要问题:原代码使用bytes作为列表变量名,而bytes是Python 3的内置类型名称,存在命名冲突,建议修改避免后续潜在问题。
正确迁移方案

修改后的完整代码如下,完全对齐原Python2代码的逻辑:

import math
import time
import struct

FRAMESTART_A = 231
FRAMETYPE_VIDEO = 6

def prepMessage(self, x):
    self.nextMessage = []
    # 避免和内置类型bytes重名,修改变量名为frame_bytes
    frame_bytes = []
    frame_bytes.append(FRAMESTART_A)  # frame start
    frame_bytes.append(FRAMETYPE_VIDEO)  # address
    for n in range(self.width):
        # set values from [0, width]
        value = 65535 * \
            (1.0 - (math.pow(0.5 * (math.sin(x / 2000 + time.time()) + 1), 4)))
        # 显式转换为整数,适配Python3 struct.pack的要求
        frame_bytes.append(int(value))
    for n in range(50 - self.width):
        # set bytes from [width, :] to zero
        frame_bytes.append(0)
    # 用*解包替换apply,也可以拆分为两行提升可读性
    fmt = "BB" + "H" * (len(frame_bytes)-2)
    message = struct.pack(fmt, *frame_bytes)
    self.nextMessage.append(message)

内容的提问来源于stack exchange,提问作者nathan lachenmyer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 22:09:02