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
相关产品推荐
相关产品推荐

