Привет,
При замене переменной s на другое значение u '\ xff' этот тест завершится неудачно.
[прецедент]
@mock_streams('stdout')
def test_puts_with_encoding_type_none_output():
"""
puts() should print unicode output without a stream encoding
"""
s = u"string!" #<====== replace to u"\xff"
output.user = True
sys.stdout.encoding = None
puts(s, show_prefix=False)
eq_(sys.stdout.getvalue(), s + "\n")
[проследить]
UnicodeEncodeError: кодек ascii не может кодировать символы в позиции 0-4: порядковый номер не в диапазоне (128)
[Комментарии]
Точка с ошибкой находится в функции '_encode' в utils.py, вам не следует просто преобразовывать сообщение в str с помощью str (msg).
def _encode(msg, stream):
if isinstance(msg, unicode) and hasattr(stream, 'encoding') and not stream.encoding is None:
return msg.encode(stream.encoding)
else:
return str(msg) #<========== buggy point
Кого-нибудь волнует?
Ага, похоже, изменение return str(msg)
на return msg
решает проблему без нарушения тестов. Но зачем вообще понадобился этот гипс?
Я не совсем уверен, что есть смысл менять это сейчас. Это не собирается полностью нарушить чей-либо код, но в основном позволяет вам puts
вещи, которые не являются строками, и получить что-то разумное:
>>> class Foo(object):
... def __str__(self): return "The best Foo in the world"
...
>>> from fabric.api import puts
>>> puts(Foo())
The best Foo in the world
Я предполагаю, что есть код, который использует это (безнадежно искать это в github, поэтому не буду пытаться искать примеры).
Я не уверен, что считаю правильным, что отсутствие набора кодировок и использование юникода приведет к сбою в puts
.
Подозреваю, что наименее наихудший способ решить эту проблему на данный момент - просто расширить строку оскорбления в этот блок:
try:
return str(msg) # Original behavior added for 'reasons'
except UnicodeDecodeError:
return msg # Best-effort fallback
Таким образом, какие бы допотопные причины мы ни имели для преобразования в строку, будут продолжать работать, но обсуждаемый случай с ошибкой вернется к «ну, я не знаю, что это, но я не могу str()
it , так что я просто запихну его в трубу как есть ".
Я столкнулся с аналогичной проблемой при запуске метода sudo
, и исключение произошло в self.stream.write(text)
в io.py
. Есть ли прогресс по вопросам юникода?
Самый полезный комментарий
Кого-нибудь волнует?