我正在将一个 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'}")
在 python 2 中有效,但在 python3 中引发异常:
AssertionError: "{'foo': 'bar'}" != "{u'foo': u'bar'}"
除了“测试不同”之外,是否有处理这些问题的标准方法?重载__repr__
?
最佳答案
摆脱那些测试;他们几乎没用:
这将测试
dict.__repr__
的 Python 实现是否正常工作。 Python 本身已经对此进行了测试;而是专注于项目代码库。如果 Python 无法正确呈现字典表示,修复该问题不是您项目的工作。Python 词典没有固定的顺序;测试它们的表示是否与给定的字符串匹配是不稳定的。
此外,Python 3.3 引入了哈希随机化,这意味着给定字典的顺序会随着调用的不同而改变。参见
PYTHONHASHSEED
.
如果您正在测试项目 API 调用的结果,请使用 self.assertEqual()
测试字典相等性反而;它将使用 assertDictEqual()
如果两个词典不匹配,给你有意义的错误信息。
由于 Python 3.3 将 u'foo'
解释为类型 str
的文字,因此将输出与 {u'foo': u'bar} 进行比较
将适用于 Python 2.6、2.7 和 3.3 及更新版本。
关于python - python2 和 python3 中的字典的 __repr__(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19554339/