Как может быть отказано в python 2 doctest и все же не имеет никакого значения в значениях в сообщении об ошибке?
Я использую Python 2.7.9 в Windows.
У меня есть файл python script с кодировкой UTF-8 со следующим содержимым:
# 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), или из командной строки:
> 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 unicode в мой doctest:
# coding=utf-8
def test_func():
u"""
>>> test_func()
u'☃'
"""
return u'\\u2603'
проходит тест. Но, насколько я могу судить, u'\u2603'
и u'☃'
должны оценивать одно и то же.
На самом деле у меня есть два вопроса о неудачном случае:
- Является ли одно из представлений, которое дает докторант (под
Expected
или Got
), неверно для значения, которое имеет доктритель для этого случая? (т.е. x != eval(repr(x))
)
- Если нет, то почему сбой теста?
Ответы
Ответ 1
В модуле doctest
используется difflib
, чтобы различать результат и ожидаемый результат. Как показано ниже:
>>> import difflib
>>> variation = difflib.unified_diff('x', 'x')
>>> list(variation)
[]
>>> variation = difflib.unified_diff('x', 'y')
>>> list(variation)
['--- \n', '+++ \n', '@@ -1 +1 @@\n', '-x', '+y']
Под капотом модуль doctest
обрабатывает результат и ожидаемый результат несколько раз. Ваша проблема, похоже, является ошибкой интерпретации, вызванной строковыми кодировками. То, что печатается на консоли, отформатировано (используя %s
), тем самым избавляясь от любых видимых различий; что делает их одинаковыми.
Ответ 2
Просто бесплатно, а также потому, что эта возможность не рассматривается в рабочем обсуждении: у меня была слабо подобная проблема. См.
[...]
Expected:
<xarray.DataArray ()>
array(0.0)
Coordinates:
d1 |S3 'nat'
d2 |S3 'dat'
d3 |S3 'a'
Got:
<xarray.DataArray ()>
array(0.0)
Coordinates:
d1 |S3 'nat'
d2 |S3 'dat'
d3 |S3 'a'
Конечно, никакой человеческой видимой. Решение в моем тривиальном случае заключалось в том, чтобы не было пробелов!
![введите описание изображения здесь]()