ctypes变量类型不一致致unittest断言失败问题排查与解决
解决ctypes结构体字段与常量类型不匹配的断言问题
我来帮你理清楚这个问题的原因和解决办法:
问题根源
当你访问ctypes结构体的字段时,ctypes会自动把底层的C类型(比如c_ubyte)转换为Python原生的int类型,方便你在Python代码里直接使用。而你的MYConst是一个c_ubyte的实例对象,所以当你用self.assertEqual(MYConst, myClassInst.MSGTYPE)比较时,其实是在比较一个c_ubyte对象和一个int对象,它们的类型不同,自然断言失败。
几种正确的写法
方法1:将常量转换为Python原生int类型
直接把MYConst转成int再比较,这样两边都是int类型,只比较数值:
self.assertEqual(int(MYConst), myClassInst.MSGTYPE)
方法2:定义常量时直接用原生int
既然结构体字段读取后是int,那你可以直接把常量定义成int,避免类型差异:
MYConst = 0xED # 直接用int,不用c_ubyte包装
这样后续赋值和断言都不会有类型问题,因为ctypes在赋值给结构体字段时会自动把int转换成对应的C类型。
方法3:将结构体字段转换回ctypes类型比较
如果你需要保持MYConst的c_ubyte类型,也可以把读取到的字段值重新包装成c_ubyte再比较:
self.assertEqual(MYConst, MyType(myClassInst.MSGTYPE))
修改后的完整测试代码
这里用方法1的修改示例,你可以根据需求选择:
from ctypes import * import unittest MyType = c_ubyte MYConst = MyType(0xED) class MyClass (Structure): _fields_ = [ ("MSGTYPE", MyType) ] class myTest(unittest.TestCase): def test(self): myClassInst = MyClass() myClassInst.MSGTYPE = MYConst print(type(MYConst)) print(type(myClassInst.MSGTYPE)) # 转换为int后比较 self.assertEqual(int(MYConst), myClassInst.MSGTYPE) if __name__ == '__main__': unittest.main()
运行这个修改后的代码,断言就会通过了。
内容的提问来源于stack exchange,提问作者meddle0106
相关产品推荐
相关产品推荐

