我将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__
?
答案 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
前缀是合法的,如果不必要的话。)