У меня есть файл README.rst
содержащий несколько доктрин для моей библиотеки Python. Все они работают, за исключением последнего документа, который print
выходные данные Unicode, закодированные в UTF-8:
Here is a failing example::
>>> print(u'\xE5\xE9\xEE\xF8\xFC')
åéîøü
(Использование print
а не просто строки очень важно для моего фактического использования, так как настоящая строка содержит встроенные строки новой строки, и мне нужно показать, как выравниваются элементы на разных линиях.)
Запуск pytest README.rst
успешно работает с Python 3.6.5 и pytest 3.6.1, но под Python 2.7.10 он терпит неудачу с очень длинной трассировкой, которая заканчивается:
input = 'åéîøü
', errors = 'strict'
def decode(input, errors='strict'):
> return codecs.utf_8_decode(input, errors, True)
E UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-4: ordinal not in range(128)
/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/encodings/utf_8.py:16: UnicodeEncodeError
Установка setenv = LC_ALL=en_US.UTF-8
в tox.ini
и работает под tox.ini
ничего не меняет; также не добавляет doctest_encoding = utf-8
в [pytest]
раздел tox.ini
. Я не вижу вариантов доктрины, имеющих отношение к моему бедственному положению. Как я могу запустить тест в Python 2.7?
Обновление: ошибка, связанная с этой проблемой, исправлена в pytest 3.6.2.
Да, print
- преступник. Самая интересная часть исключения:
def getvalue(self):
result = _SpoofOut.getvalue(self)
if encoding:
result = result.decode(encoding)
локальные /Library/python2.7/сайт-пакеты/_pytest/doctest.py: 509:
pytest
пытается декодировать unicode, поэтому Python пытается сначала его закодировать - и терпит неудачу. Я думаю, что это ошибка в pytest: она должна проверить, является ли result
байтами или unicode:
if encoding and isinstance(result, bytes):
result = result.decode(encoding)
Пожалуйста, сообщите об этом в журнал отслеживания проблем. Вы можете проверить исправление, и если он работает, вы можете отправить запрос на вытягивание.