Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.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
对Python doctest的多版本支持_Python_Python 3.x_Doctest - Fatal编程技术网

对Python doctest的多版本支持

对Python doctest的多版本支持,python,python-3.x,doctest,Python,Python 3.x,Doctest,我写的博士论文是这样的: >>> some_function(a=1, b=2) {u'id': u'123', u'name': u'abc'} >>> some_function(a=1, b=2) {'id': '123', 'name': 'abc'} >>> some_function(a=1, b=2) == {'id': '123', 'name': 'abc'} True 这在Python 2.5、2.6和2.7版中运行

我写的博士论文是这样的:

>>> some_function(a=1, b=2)
{u'id': u'123', u'name': u'abc'}
>>> some_function(a=1, b=2)
{'id': '123', 'name': 'abc'}
>>> some_function(a=1, b=2) == {'id': '123', 'name': 'abc'}
True
这在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)
{u'id': u'123', u'name': u'abc'}
>>> some_function(a=1, b=2)
{'id': '123', 'name': 'abc'}
>>> some_function(a=1, b=2) == {'id': '123', 'name': 'abc'}
True

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

我在IPython中遇到了与Doctest相同的问题。没有简洁的解决方案,但我将所有的
u'
前缀包装在
{}
中,即
{u}
,并创建了一个适当的函数来包含或排除它们

你可以看到和看到

但这相当混乱,所以我已经把很多测试从博士转移了

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

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

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

我在NLTK中遇到了与doctest相同的问题;通过使用自定义doctest输出检查器(将u'foo'和'foo'视为相同)解决了此问题,该检查器由自定义nose插件安装:

这个解决方案并不漂亮,但它工作得很好(NLTK中大约有0.5兆字节的doctest),并且不会降低doctest的可读性


编辑:找到了此nose插件的简化独立版本:

如果使用pytest,您只需执行以下操作:

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

如果您运行的是Python3,则u将被剥离,并保留在Python2中。

您必须使用与使代码在Python2.x和3.x中工作相同的技术。那会很快变得丑陋。就个人而言,我会坚持使用unittests而不是DoctTests,并使用Sphinx编写API文档。我确实使用unittest进行测试,这只是为了验证示例。您是否尝试过使用Python 3.3?3.3重新引入u“”语法()。不知道更改是否会影响doctest,但值得一试。@codeape:您可以使用
u'
指定一个文本,但是
repr(somestring)
不会使用它们,因此测试仍然会失败。将其与使用
r''
原始python文本进行比较;
r
也将从表示中删除。好的,我明白了。我想用doctest做这件事的唯一方法就是重写测试。例如
>>>result=some_函数(a=1,b=2)>>>打印(result[“id]”)
等。nose插件链接现在是404。这对我不起作用,请参见我的后续问题: