10

我正在这样写我的文档测试:

>>> some_function(a=1, b=2)
{u'id': u'123', u'name': u'abc'}

这适用于 Python 版本 2.5、2.6 和 2.7,但对于 Python 3 失败并出现以下错误:

Expected:
    {u'id': u'123', u'name': u'abc'}
Got:
    {'id': '123', 'name': 'abc'}

问题是,如果我这样写我的文档测试:

>>> some_function(a=1, b=2)
{'id': '123', 'name': 'abc'}

它们仅适用于 Python3,在 Python2 版本上失败。我的问题是如何使它跨版本兼容?

4

3 回答 3

8

我在 IPython 中遇到了与 doctests 相同的问题。没有简洁的解决方案,但我将所有u'前缀都包装在{}, ie{u}'中,并制作了一个小函数,可以根据需要包含或排除它们。

您可以看到u_format() 函数使用它的文档测试。

但这相当混乱,所以我将许多测试从 doctest 中移开。

或者,您可以像这样测试它:

>>> some_function(a=1, b=2) == {'id': '123', 'name': 'abc'}
True

如果您在键中需要一些 unicode 字符串,您可以使用u'abþ',并使用分发2to3在 doctests 上运行。但这仅适用于输入代码,不适用于输出 reprs。

于 2012-11-20T13:21:28.510 回答
4

如果你使用 pytest,你可以这样做:

>>> some_function(a=1, b=2) # doctest: +ALLOW_UNICODE
{u'id': u'123', u'name': u'abc'}

如果您正在运行 Python 3,则 u 将被剥离,并保留在 Python 2 中。

于 2016-11-13T20:01:57.383 回答
3

我在 NLTK 中遇到了与 doctests 相同的问题;它是通过使用由自定义鼻子插件安装的自定义 doctest 输出检查器(将 u'foo' 和 'foo' 视为相同)解决的:https ://github.com/nltk/nltk/blob/develop/nltk /test/doctest_nose_plugin.py

这个解决方案不是很漂亮,但效果很好(NLTK 中有大约 0.5 兆字节的文档测试)并且它不会降低文档测试的可读性。

编辑:找到了这个鼻子插件的简化独立版本:https ://github.com/gnublade/doctest-ignore-unicode

于 2012-12-04T18:18:09.510 回答