Как может быть отказано в 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'

Конечно, никакой человеческой видимой. Решение в моем тривиальном случае заключалось в том, чтобы не было пробелов!

введите описание изображения здесь