python2和python3中的dict的__repr __()

Chr*_*ier 4 python testing repr python-2.7 python-3.x

我正在将一个python库从python 2移植到一个代码库(2.6,2.7和3.3+)中的python 2和3.剩下的主要问题是很多测试使用这样的东西:

def test(self):
 example = {u'foo': u'bar'}
 self.assertEqual(str(example), "{u'foo': u'bar'}")
Run Code Online (Sandbox Code Playgroud)

它在python 2中工作,但在python3中引发异常:

 AssertionError: "{'foo': 'bar'}" != "{u'foo': u'bar'}"
Run Code Online (Sandbox Code Playgroud)

除了"测试不同"之外,还有一种处理这些问题的标准方法吗?超载__repr__

Mar*_*ers 8

摆脱那些测试; 他们旁边没用了:

  • 这测试Python的实现dict.__repr__是否有效.Python本身已经对此进行了测试; 而是专注于项目代码库.如果Python无法正确呈现字典表示,那么修复它不是您项目的工作.

  • Python词典没有固定的顺序; 测试它们的表示是否与给定字符串匹配不会稳定.

    此外,Python 3.3引入了哈希随机化,这意味着给定字典的顺序将从调用更改为调用.见PYTHONHASHSEED.

如果您正在测试项目API calll的结果,请使用self.assertEqual()而不是测试字典相等性; assertDictEqual()如果两个词典不匹配,它将用于给你有意义的错误消息.

由于Python 3.3将其解释u'foo'为类型的文字str,因此比较输出{u'foo': u'bar}将适用于Python 2.6,2.7和3.3及更高版本.

  • 此外,在python3中,默认情况下字符串变为unicode.这意味着标准字符串不再具有"u"前缀. (2认同)