Fabric: UnicodeEncodeError cuando se llama a la función put con unicode u '\ xff' y la codificación de stream es None

Creado en 8 abr. 2015  ·  5Comentarios  ·  Fuente: fabric/fabric

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
Bug Needs investigation Needs patch

Comentario más útil

¿A alguien le importa?

Todos 5 comentarios

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

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

Grazfather picture Grazfather  ·  4Comentarios

bitprophet picture bitprophet  ·  6Comentarios

yuvadm picture yuvadm  ·  5Comentarios

neemxyang picture neemxyang  ·  6Comentarios

acdha picture acdha  ·  4Comentarios
bleepcoder.com utiliza la información de GitHub con licencia pública para proporcionar a los desarrolladores de todo el mundo soluciones a sus problemas. No estamos afiliados a GitHub, Inc. o a ningún desarrollador que use GitHub para sus proyectos. No alojamos ninguno de los vídeos o imágenes en nuestros servidores. Todos los derechos pertenecen a sus respectivos propietarios.
Fuente de esta página: Fuente

Lenguajes de programación populares
Proyectos populares de GitHub
Más proyectos de 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.