Hola,
Al reemplazar la variable sa otro valor u '\ xff' , esta prueba fallaría.
[caso de prueba]
@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")
[rastrear]
UnicodeEncodeError: el códec 'ascii' no puede codificar caracteres en la posición 0-4: ordinal no está en el rango (128)
[comentarios]
El punto con errores se ubica en la función '_encode' en utils.py, no debe simplemente convertir el mensaje en 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
¿A alguien le importa?
Sí, parece que cambiar return str(msg)
a return msg
resuelve el problema sin romper las pruebas. Pero, ¿por qué este elenco era necesario en primer lugar?
No estoy absolutamente seguro de que tenga sentido cambiar esto ahora. No va a romper absolutamente el código de nadie, pero básicamente te permite puts
cosas que no son cadenas y obtener 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
Supongo que hay un código que usa esto (es imposible buscar esto en github, así que no voy a intentar buscar ejemplos).
Sin embargo, no estoy seguro de pensar que sea correcto que no tener un conjunto de codificación y usar unicode haga que puts
nos bloquee.
Sospeche que la peor forma de abordar esto por ahora es simplemente expandir la línea ofensiva en este bloque:
try:
return str(msg) # Original behavior added for 'reasons'
except UnicodeDecodeError:
return msg # Best-effort fallback
De esta manera, cualquier razón antediluviana que tuviéramos para el casting-to-string continuará funcionando, pero el caso de errores en discusión volvería a "bueno, no sé qué es esto, pero no puedo str()
eso , así que lo empujaré por la tubería como está ".
Encontré un problema similar mientras ejecutaba el método sudo
, y la excepción ocurrió en self.stream.write(text)
en io.py
. ¿Hay algún progreso en los problemas de Unicode?
Comentario más útil
¿A alguien le importa?