Python Doctest由于unicode导致u

Python Doctest由于unicode导致u,python,unicode,portability,doctest,Python,Unicode,Portability,Doctest,我正在为输出标记化单词列表的函数编写doctest r''' >>> s = "This is a tokenized sentence s\u00f3" >>> tokenizer.tokenize(s0) ['This', 'is', 'a', 'tokenized', 'sentence', 'só'] ''' 使用Python3.4我的测试顺利通过 使用Python2.7我得到: Expected: ['This', 'is', 'a', '

我正在为输出标记化单词列表的函数编写doctest

r'''

>>> s = "This is a tokenized sentence s\u00f3"
>>> tokenizer.tokenize(s0)
['This', 'is', 'a', 'tokenized', 'sentence', 'só']

'''
使用Python3.4我的测试顺利通过

使用Python2.7我得到:

Expected:
  ['This', 'is', 'a', 'tokenized', 'sentence', 'só']
Got:
  [u'This', u'is', u'a', u'tokenized', u'sentence', u's\xf3']

我的代码必须同时在Python3.4和Python2.7上工作。如何解决这个问题?

Python 3对Unicode对象使用不同的字符串文本。没有
u
前缀(在规范表示中),一些非ascii字符按字面意思显示,例如,
'só'
是Python 3中的Unicode字符串(如果您在输出中看到它,它是Python 2上的bytestring)

如果您感兴趣的是函数如何将输入文本拆分为标记;您可以在单独的行上打印每个标记,以使结果与Python 2/3兼容:

print("\n".join(tokenizer.tokenize(s0)))
This
is
a
tokenized
sentence
só
作为替代方案,您可以,例如:

#!/usr/bin/env python
r"""
>>> u"This is a tokenized sentence s\u00f3".split()
[u'This', u'is', u'a', u'tokenized', u'sentence', u's\xf3']
"""
import doctest
import re
import sys

class Py23DocChecker(doctest.OutputChecker):
    def check_output(self, want, got, optionflags):
        if sys.version_info[0] > 2:
            want = re.sub("u'(.*?)'", "'\\1'", want)
            want = re.sub('u"(.*?)"', '"\\1"', want)
        return doctest.OutputChecker.check_output(self, want, got, optionflags)

if __name__ == "__main__":
    import unittest

    suite = doctest.DocTestSuite(sys.modules['__main__'], checker=Py23DocChecker())
    sys.exit(len(unittest.TextTestRunner().run(suite).failures))

测试
unicode
名称,并相应调整测试(如果已定义)?由于这些脆弱性,你从来都不喜欢doctest。你可以找到一个这样做的例子,看看这个答案。最简单的方法是将测试更改为
>>标记器。标记器(s0)=[…]\n使用
可能重复的