Fabric: UnicodeEncodeError при вызове помещает функцию с юникодом u '\ xff' и stream.encoding - None

Созданный на 8 апр. 2015  ·  5Комментарии  ·  Источник: fabric/fabric

Привет,
При замене переменной 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
Bug Needs investigation Needs patch

Самый полезный комментарий

Кого-нибудь волнует?

Все 5 Комментарий

Кого-нибудь волнует?

Ага, похоже, изменение 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 . Есть ли прогресс по вопросам юникода?

Была ли эта страница полезной?
0 / 5 - 0 рейтинги
bleepcoder.com использует общественно лицензированную информацию GitHub для предоставления решений разработчикам по всему миру. Мы не аффилированы с GitHub, Inc. или любым другим разработчиком, использующим GitHub для своих проектов. Мы не размещаем видео или изображения на наших серверах. Все права принадлежат их соответствующим владельцам.
Источник для этой страницы: Источник

Популярные языки программирования
Популярные проекты GitHub
Больше проектов GitHub

© 2024 bleepcoder.com - Contact
Made with in the Dominican Republic.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.