如何通过pytest触发doctests忽略字符串的unicode前缀`u'...'`?

时间:2017-09-28 09:17:37

标签: python-2.7 unicode pytest doctest

我希望我的代码可以在Python 2和3中使用。我使用doctests和

from __future__ import unicode_literals

我是否可以设置一个标志/插件,使其忽略Python 2具有unicode字符串的u前缀?

实施例

一个在Python 3中有效但在Python 2中失败的测试:

Expected:
    'Me \\& you.'
Got:
    u'Me \\& you.'

最小的例子

from __future__ import unicode_literals


def foo():
    """

    Returns
    -------
    unicode - for Python 2 and Python 3

    Examples
    --------
    >>> foo()
    'bar'
    """
    return 'bar'


if __name__ == '__main__':
    import doctest
    doctest.testmod()

1 个答案:

答案 0 :(得分:0)

如果您直接使用doctest,则可以按照Dirkjan Ochtman的博客文章Single-source Python 2/3 doctests覆盖OutputChecker:

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)

doctest.DocTestSuite(mod, checker=Py23DocChecker())

如果您使用的是py.test,则可以在pytest.ini中指定doctest_optionflags = ALLOW_UNICODE。参见https://docs.pytest.org/en/latest/doctest.html