python - python2 和 python3 中的字典的 __repr__()

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

我正在将一个 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/

相关文章:

php - 在沙盒模式下运行 PHP、Ruby 或 Python 进程

c# - 估计 GUID 中数字出现的概率

python - “frozenset”对象不可调用

Python Paho 客户端发布失败,至少有 1 个错过发布

python - 在其他列中选择满足多个条件的列值

testing - Jasmine2 和 Protractor 创建的错误文件夹

testing - 如何测试 Meteor 应用程序?

python - Django - 导入错误 : No module named apps

python - 是否有一种可接受的方法从不是 "from module import *"的全局命名空间中导入所有内容

python - 如何有效地合并这两个数据集?