Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dict';python2和python3中的_Python_Testing_Python 2.7_Python 3.x_Repr - Fatal编程技术网

dict';python2和python3中的

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'}" !

我正在一个代码库(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'}" != "{u'foo': u'bar'}"

除了“测试不同”之外,是否还有处理这些问题的标准方法?重载
\uuu repr\uuu

摆脱那些测试;它们几乎毫无用处:

  • 这将测试dict.\uu repr\uu的Python实现是否正常工作。Python本身已经对此进行了测试;而是关注项目代码库。如果Python无法正确呈现字典表示,那么修复它不是您的项目的工作

  • Python字典没有固定的顺序;测试它们的表示是否与给定的字符串匹配是不稳定的

    此外,Python3.3引入了散列随机化,这意味着给定字典的顺序将随着调用的不同而变化。看

如果您正在测试项目API调用的结果,请改为使用测试字典相等性;如果两个字典不匹配,它将用于提供有意义的错误消息


由于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。这意味着标准字符串不再有thet
u
前缀。检查
self.assertEqual(例如,ast.literal\u eval({u'foo:u'bar'))
是不可能的,并且有类似的用途……但我仍然无法想象这可能是什么用途,所以很难说它是否足够相似。@MartijnPieters,公平地说,排序在本例中是不相关的:
len(示例)==1
assertDictEqual
在2.6中不存在。在2.7和3.3中,虽然它确实存在,“默认情况下,此方法将用于比较调用
assertEqual()
”中的字典,因此它不会增加太多内容。@TimPeters:当然;但OP不是测试长度;他正在测试Python
dict.\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
进行测试。我想我会用上它,然后结束它。