dict';python2和python3中的
我正在一个代码库(2.6、2.7和3.3+)中将python库从python 2移植到python 2和python 3。剩下的主要问题是,很多测试都使用类似的方法:dict';python2和python3中的,python,testing,python-2.7,python-3.x,repr,Python,Testing,Python 2.7,Python 3.x,Repr,我正在一个代码库(2.6、2.7和3.3+)中将python库从python 2移植到python 2和python 3。剩下的主要问题是,很多测试都使用类似的方法: def test(self): example = {u'foo': u'bar'} self.assertEqual(str(example), "{u'foo': u'bar'}") 它在python 2中工作,但在python 3中引发了一个异常: AssertionError: "{'foo': 'bar'}" !
def test(self):
example = {u'foo': u'bar'}
self.assertEqual(str(example), "{u'foo': u'bar'}")
它在python 2中工作,但在python 3中引发了一个异常:
AssertionError: "{'foo': 'bar'}" != "{u'foo': u'bar'}"
除了“测试不同”之外,是否还有处理这些问题的标准方法?重载
\uuu repr\uuu
?摆脱那些测试;它们几乎毫无用处:
- 这将测试dict.\uu repr\uu的Python实现是否正常工作。Python本身已经对此进行了测试;而是关注项目代码库。如果Python无法正确呈现字典表示,那么修复它不是您的项目的工作
- Python字典没有固定的顺序;测试它们的表示是否与给定的字符串匹配是不稳定的 此外,Python3.3引入了散列随机化,这意味着给定字典的顺序将随着调用的不同而变化。看
由于Python3.3将
u'foo'
解释为类型str
的文本,因此将输出与{u'foo':u'bar}
进行比较将适用于Python2.6、2.7和3.3及更新版本。我怀疑这不是您真正的代码,而您真正的代码所做的事情就不那么愚蠢了:尝试验证字典是否匹配某些预期结果
方法是直接比较字典,而不是比较它们的字符串表示形式:
self.assertEqual(example, {u'foo': u'bar'})
这在2.x和3.x中都可以使用(因为您需要3.3+,这意味着
u
前缀是合法的,如果不需要的话)。此外,在python3中,字符串默认为unicode。这意味着标准字符串不再有thetu
前缀。检查self.assertEqual(例如,ast.literal\u eval({u'foo:u'bar'))
是不可能的,并且有类似的用途……但我仍然无法想象这可能是什么用途,所以很难说它是否足够相似。@MartijnPieters,公平地说,排序在本例中是不相关的:len(示例)==1
assertDictEqual
在2.6中不存在。在2.7和3.3中,虽然它确实存在,“默认情况下,此方法将用于比较调用assertEqual()
”中的字典,因此它不会增加太多内容。@TimPeters:当然;但OP不是测试长度;他正在测试Pythondict.\uuu repr\uuu()
是否仍在工作。为什么要进行这些测试?他们试图验证什么?这很像一个。澄清一下:在实际代码中,example是dict的一个子类,是另一个函数的返回值。这个子类有它自己的\uuuu repr\uuuu
,包装了dict的\uu repr\uuu
,但是'u'仍然在那里,这并没有澄清任何事情。你到底想测试什么?问题是子类的\uuuu eq\uuuu
不能与基本dict
对象一起正常工作,因此您试图通过比较它们的repr
来解决它?或者…?@Christiangeer:你在和一个固定的字符串进行比较;如果您必须测试自定义的\uuuuurepr\uuuuuu
@abarnert\uuuuuueq\uuuuu
是否有效,我不知道原始作者为什么通过\uuuuurepr\uuuu
进行测试。我想我会用上它,然后结束它。