saf*_*fsd 19 python unicode doctest
我正在研究一些必须操纵unicode字符串的代码.我正在尝试为它编写doctests,但我遇到了麻烦.以下是说明问题的最小示例:
# -*- coding: utf-8 -*-
def mylen(word):
"""
>>> mylen(u"áéíóú")
5
"""
return len(word)
print mylen(u"áéíóú")
Run Code Online (Sandbox Code Playgroud)
首先,我们运行代码以查看预期的输出print mylen(u"áéíóú").
$ python mylen.py
5
Run Code Online (Sandbox Code Playgroud)
接下来,我们运行doctest来查看问题.
$ python -m
5
**********************************************************************
File "mylen.py", line 4, in mylen.mylen
Failed example:
mylen(u"áéíóú")
Expected:
5
Got:
10
**********************************************************************
1 items had failures:
1 of 1 in mylen.mylen
***Test Failed*** 1 failures.
Run Code Online (Sandbox Code Playgroud)
那我怎么测试mylen(u"áéíóú")评估为5?
u0b*_*6ae 20
如果你想要unicode字符串,你必须使用unicode docstrings!介意u!
# -*- coding: utf-8 -*-
def mylen(word):
u""" <----- SEE 'u' HERE
>>> mylen(u"áéíóú")
5
"""
return len(word)
print mylen(u"áéíóú")
Run Code Online (Sandbox Code Playgroud)
这将有效 - 只要测试通过.对于Python 2.x,您需要另一个hack来使详细的doctest模式工作或在测试失败时获得正确的回溯:
if __name__ == "__main__":
import sys
reload(sys)
sys.setdefaultencoding("UTF-8")
import doctest
doctest.testmod()
Run Code Online (Sandbox Code Playgroud)
NB!只能使用setdefaultencoding进行调试.我接受它用于doctest使用,但不接受你的生产代码中的任何地方.
Python 2.6.6不能很好地理解unicode输出,但可以使用以下方法修复:
sys.setdefaultencoding("UTF-8")print声明.在我的情况下,这个docstring告诉测试被破坏:
def beatiful_units(*units):
u'''Returns nice string like 'erg/(cm² sec)'.
>>> beatiful_units(('erg', 1), ('cm', -2), ('sec', -1))
u'erg/(cm² sec)'
'''
Run Code Online (Sandbox Code Playgroud)
带有"错误"消息
Failed example:
beatiful_units(('erg', 1), ('cm', -2), ('sec', -1))
Expected:
u'erg/(cm² sec)'
Got:
u'erg/(cm\xb2 sec)'
Run Code Online (Sandbox Code Playgroud)
使用print我们可以修复:
def beatiful_units(*units):
u'''Returns nice string like 'erg/(cm² sec)'.
>>> print beatiful_units(('erg', 1), ('cm', -2), ('sec', -1))
erg/(cm² sec)
'''
Run Code Online (Sandbox Code Playgroud)