【发布时间】:2015-05-16 03:19:34
【问题描述】:
我在 Windows 中使用 Python 2.7.9。
我有一个 UTF-8 编码的 Python 脚本文件,其内容如下:
# coding=utf-8
def test_func():
u"""
>>> test_func()
u'☃'
"""
return u'☃'
我在运行 doctest 时遇到了奇怪的失败:
Failed example:
test_func()
Expected:
u'\u2603'
Got:
u'\u2603'
无论我是通过我通常使用的 IDE (IDEA IntelliJ) 还是从命令行启动 doctest,我都会看到同样的失败输出:
> x:\my_virtualenv\Scripts\python.exe -m doctest -v hello.py
我将Expected 和Got 下的行复制到WinMerge 中,以排除我无法识别的字符中的一些细微差别;它告诉我它们是相同的。
但是,如果我重做命令行运行,但将输出重定向到文本文件,如下所示:
> x:\my_virtualenv\Scripts\python.exe -m doctest -v hello.py > out.txt
测试仍然失败,但产生的失败输出有点不同:
Failed example:
test_func()
Expected:
u'☃'
Got:
u'\u2603'
如果我将转义的 unicode 文字放在我的 doctest 中:
# coding=utf-8
def test_func():
u"""
>>> test_func()
u'☃'
"""
return u'\\u2603'
测试通过。但据我所知,u'\u2603' 和 u'☃' 的评估结果应该相同。
关于失败的案例,我真的有两个问题:
- 医生给出的其中一种表示(在
Expected或Got下)对于医生在这种情况下的值是否不正确? (即x != eval(repr(x))) - 如果不是,为什么测试会失败?
【问题讨论】:
-
总结一下问题:doctester比较representation domain中的结果。这个问题实际上更像
x != repr(eval(x))(发生这种情况,因为在 Python 中表示相同字符串的方法不止一种); doctester 采用具有\u转义序列的实际函数输出的表示形式,并将其与我给出的具有文字unicode 字符的预期表示形式进行比较。当失败时,它使用格式运算符打印表示,该运算符还将预期表示中的文字 unicode 字符转换为转义。 -
进行比较值的表示而不是比较实际值的测试并不理想,但实现起来可能更实际。