Python2:测试返回unicode字符串的函数输出

时间:2013-09-13 16:11:13

标签: python-2.7 unicode

我有一个内部使用unicode的函数,我想用py.test测试它。目前,我有以下代码:

def test_num2word():
    assert num2word(2320)  == u"dva tisíce tři sta dvacet"

然而,断言失败了:

E       assert u'dva tis\xed...i sta dvacet ' == u'dva tis\xc3\...9i sta dvacet'
E         - dva tis\xedce t\u0159i sta dvacet 
E         ?        ^    ^            -
E         + dva tis\xc3\xadce t\xc5\x99i sta dvacet
E         ?

据我所知,我的函数正确返回unicode,然后它尝试与utf-8编码的字符串进行比较,这显然会失败。然而,我认为在我的源代码中使用u"..."也会将字符串转换为Python内部使用的相同编码。

我的问题是,是否有一种比较这些的理智方式,或者我是否需要使用decode('utf-8')(在右侧)或encode('utf-8')(在左边。即使我写了一个包装器函数,这对我来说并不理想 - 必须有一种方法来比较这个!不,使用Python 3不是一个选项。

1 个答案:

答案 0 :(得分:1)

您的错误并不清楚,但看起来像;

assert u'dva tis\xed...i sta dvacet ' == u'dva tis\xc3\...9i sta dvacet'

这些字符串前面都有u,因此它们是unicode字符串。但其中一个包含错误的内容:dva tisíce tÅi sta dvacet

如果该字符串是从测试py文件获取的字符串,那么问题是源代码本身没有使用与保存它相同的编码来读取。这可以通过两种方式解决:

  1. 在文本编辑器中另存为UTF-8,并在文件顶部加入# -*- coding: utf-8 -*-行(请参阅this question

  2. 在源代码中使用字符串文字编码,以避免依赖源文件编码:

    断言num2word(2320)== u'dva tis \ u00edce t \ u0159i sta dvacet'

  3. (*:它们在内存中存储在内存中的编码是一个很长的故事,但是作为Python程序员,这通常不必担心。)