如何使用 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
。
我不知道如何使用 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
。