Fabric: UnicodeEncodeError ao chamar a função puts com unicode u '\ xff' e o stream.encoding é Nenhum

Criado em 8 abr. 2015  ·  5Comentários  ·  Fonte: fabric/fabric

Oi,
Ao substituir a variável s por outro valor u '\ xff' , este teste falharia.

[caso de teste]

@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")

[traceback]
UnicodeEncodeError: o codec 'ascii' não pode codificar caracteres na posição 0-4: ordinal fora do intervalo (128)

[comentários]
O ponto de bug está localizado na função '_encode' em utils.py, você não deve simplesmente converter a mensagem em str usando 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

Comentários muito úteis

Alguém se importa?

Todos 5 comentários

Alguém se importa?

Sim, parece que alterar return str(msg) para return msg resolve o problema sem quebrar os testes. Mas por que esse elenco foi necessário em primeiro lugar?

Não tenho certeza absoluta de que faça sentido mudar isso agora. Não vai quebrar absolutamente o código de ninguém, mas basicamente permite que você puts coisas que não são strings e extraia algo sensato:

>>> 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

Suponho que haja código por aí que usa isso (impossível procurar por isso no github, então não vou tentar procurar exemplos).

Não tenho certeza se acho certo que não ter um conjunto de codificação e usar Unicode fará com que puts nos deixe de funcionar.

Suspeite que a maneira menos-pior de resolver isso agora é simplesmente expandir a linha ofensiva neste bloco:

try:
    return str(msg) # Original behavior added for 'reasons'
except UnicodeDecodeError:
    return msg # Best-effort fallback

Dessa forma, quaisquer motivos antediluvianos que tivéssemos para lançar em string continuarão a funcionar, mas o caso problemático em discussão voltaria a "bem, não sei o que é isso, mas não posso str() it , então vou enfiá-lo no cano como está ".

Eu encontrei um problema semelhante ao executar o método sudo , e a exceção aconteceu em self.stream.write(text) em io.py . Há algum progresso nas questões de Unicode?

Esta página foi útil?
0 / 5 - 0 avaliações
bleepcoder.com usa informações licenciadas publicamente pela GitHub para fornecer aos desenvolvedores em todo o mundo soluções para seus problemas. Não somos afiliados à GitHub, Inc. nem a nenhum desenvolvedor que utilize GitHub para seus projetos. Nós não hospedamos nenhum dos vídeos ou imagens em nossos servidores. Todos os direitos pertencem a seus respectivos proprietários.
Fonte para esta página: Fonte

Linguagens de programação populares
Projetos populares do GitHub
Mais projetos 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.