我在unittest TestCase中有以下代码(作为示例)
def test(self):
a = array('u','\0'*3)
a[0] = 'h'
a[1] = 'h'
a[2] = 'h'
self.assertEqual(a.tostring(), "hhh")
断言失败,出现以下错误:
AssertionError: b'h\x00\x00\x00h\x00\x00\x00h\x00\x00\x00' != 'hhh'
现在我明白我创建的数组是用于4个字节长的Unicode字符,因此我输入的每个字符都需要额外的3个NUL字节。我的问题是:
编辑:回答已经出现的问题: 1.我使用的是Python 3 2.数组来自模块数组,可以导入:from array import array
答案 0 :(得分:3)
我想你正在使用Python3,它似乎缺少'c'
的{{1}}选项。
在这种情况下,我会做
array
另一种选择是
a = array.array("b",4*(0,))
a[0] = 'h'
a[1] = 'h'
a[2] = 'h'
但是你有一个unicode字符串而不是a=array.array('u', "hhh") # the same as yours, but shorter
a.tounicode()
对象。
答案 1 :(得分:1)
您所做的是明确请求数组的bytes
表示。当然,这不等于unicode表示。
来自文档:
array.tostring():tobytes()的弃用别名。
array.tobytes():将数组转换为机器值数组 并返回字节表示(相同的字节序列) 这将通过tofile()方法写入文件。)
3.2版中的新功能:为清晰起见,将tostring()重命名为tobytes()。
您需要使用tounicode
代替:
>>> import array
>>> s = "a\xbb\ucccc\U0001dddd"
>>> array.array('u', s).tounicode() == s
True
如果要从Python 2.x中迁移某些代码,您会发现这与您在那里看到的相当;上述代码段的Python 2.x版本的唯一区别是s = u"etc etc"
。
类型'u'是阵列模块中一个黑暗的很少访问的角落,它本身就是Python的一个黑暗角落。如果你不是从Python 2.x迁移,你可能想说出你想要实现的目标(可变字符串?),并获得一些指导。