如何使用Sphinx doctest测试非ASCII字符的输出?

时间:2015-12-01 20:29:37

标签: python-2.7 unicode python-sphinx non-ascii-characters doctest

我不知道如何使用Sphinx doctest测试包含非ASCII字符的打印输出。

当我测试包含生成非ASCII字符的代码或包含非ASCII字符的预期结果时,我会遇到编码错误。

例如,如果我有:

def foo():
    return 'γ'

然后是doctest,包括

>>> print(foo())

将产生

形式的错误
  

编码错误:   ' ASCII'编解码器不能对字符u' \ u03b3'进行编码。位置0:序数不在范围内(128)

表格的任何测试

>>> print('')
γ

只有确保我的所有功能都不会尝试print,而且没有预期的打印结果包含这些字符,才能避免这些错误。结果我不得不禁用许多重要的测试。

我所有代码的头部

# encoding: utf8
from __future__ import unicode_literals

和(在绝望中)我尝试过像

这样的事情
doctest_global_setup =(
    '#encoding: utf8\n\n'
    'from __future__ import unicode_literals\n'
)

.. testsetup:: 
   from __future__ import unicode_literals

但这些(当然)不会改变结果。

如何使用Sphinx doctest测试非ASCI字符的输出?

1 个答案:

答案 0 :(得分:2)

我认为这是由于您的from __future__ import unicode_literals声明。 print将隐式地将Unicode字符串编码为终端编码。缺少终端,Python 2将默认为ascii编解码器。

如果您跳过明确的print,则无论是否使用导入都可以使用

>>> def foo():
...  return 'ë'
...
>>> foo()
'\x89'

或者:

>>> from __future__ import unicode_literals
>>> def foo():
...  return 'ë'
...
>>> foo()
u'\xeb'

然后你可以测试字符串的转义表示。

您还可以尝试使用print更改PYTHONIOENCODING=utf8本身的编码。