python2和python3中的dict的__repr __()

时间:2013-10-23 23:41:53

标签: python testing python-2.7 python-3.x repr

我将python 2中的python库仅移植到一个代码库(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'}")

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

 AssertionError: "{'foo': 'bar'}" != "{u'foo': u'bar'}"

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

2 个答案:

答案 0 :(得分:8)

摆脱那些测试;他们几乎没用:

  • 这测试dict.__repr__的Python实现是否有效。 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及更高版本。

答案 1 :(得分:3)

我怀疑这不是你真正的代码,而你真正的代码却做了一些不那么愚蠢的事情:尝试验证字典是否符合某些预期结果。

这样做的方法是直接比较词典,而不是比较它们的字符串表示:

self.assertEqual(example, {u'foo': u'bar'})

这将适用于2.x和3.x(因为您需要3.3+,这意味着u前缀是合法的,如果不必要的话。)