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
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?
Comentários muito úteis
Alguém se importa?