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

How can I test output of non-ASCII characters using Sphinx doctest?

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

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

例如,如果我有:

def foo():
    return 'γ'

然后是 doctest,包括

>>> print(foo())

会产生形式为

的错误

Encoding error: 'ascii' codec can't encode character u'\u03b3' in position 0: ordinal not in range(128)

任何形式的测试都会如此

>>> print('')
γ

只有确保我尝试 print 结果的函数 none 和预期打印结果的 none 包含此类字符,我才能避免这些错误.结果我不得不禁用许多重要的测试。

我所有代码的开头

# 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 字符的输出?

我认为这是由于您的 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