Fabric: UnicodeEncodeError beim Aufrufen der Puts-Funktion mit dem Unicode u '\ xff' und der stream.encoding ist None

Erstellt am 8. Apr. 2015  ·  5Kommentare  ·  Quelle: fabric/fabric

Hallo,
Wenn die Variable s durch einen anderen Wert u '\ xff' ersetzt wird ,

[Testfall]

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

[zurück verfolgen]
UnicodeEncodeError: Der Codec 'ascii' kann keine Zeichen an Position 0-4 codieren: Ordnungszahl nicht im Bereich (128)

[Bemerkungen]
Der Buggy-Punkt befindet sich in der Funktion '_encode' in utils.py. Sie sollten die Nachricht nicht einfach mit str (msg) in str umwandeln.

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

Hilfreichster Kommentar

Interessiert es jemanden?

Alle 5 Kommentare

Interessiert es jemanden?

Ja, es scheint, dass das Ändern von return str(msg) in return msg das Problem löst, ohne die Tests zu unterbrechen. Aber warum war diese Besetzung überhaupt notwendig?

Ich bin mir nicht sicher, ob es Sinn macht, dies jetzt zu ändern. Es wird nicht unbedingt den Code von irgendjemandem brechen, aber es ermöglicht Ihnen im Grunde puts Dinge, die keine Strings sind und etwas Vernünftiges herausholen:

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

Ich vermute, es gibt Code da draußen, der dies verwendet (hoffnungslos, um in Github danach zu suchen, also werde ich nicht versuchen, nach Beispielen zu suchen).

Ich bin mir nicht sicher, ob es richtig ist, dass ein fehlender Codierungssatz und die Verwendung von Unicode dazu führen, dass puts uns zum Absturz bringt.

Der Verdacht, dass der am wenigsten schlimmste Weg, dies zu beheben, darin besteht, die betreffende Zeile einfach in diesen Block zu erweitern:

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

Auf diese Weise funktionieren alle antidiluvianischen Gründe, die wir für das Casting-to-String hatten, weiterhin, aber der diskutierte Buggy-Fall würde auf "Nun, ich weiß nicht, was das ist, aber ich kann es nicht str() zurückgreifen , also schiebe ich es einfach so wie es ist in die Pfeife ".

Beim Ausführen der Methode sudo ein ähnliches Problem aufgetreten, und die Ausnahme ist bei self.stream.write(text) in io.py . Gibt es Fortschritte bei den Unicode-Problemen?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen
bleepcoder.com verwendet öffentlich lizenzierte GitHub-Informationen, um Entwicklern auf der ganzen Welt Lösungen für ihre Probleme anzubieten. Wir sind weder mit GitHub, Inc. noch mit anderen Entwicklern affiliiert, die GitHub für ihre Projekte verwenden. Wir hosten keine der Videos oder Bilder auf unseren Servern. Alle Rechte gehören ihren jeweiligen Eigentümern.
Quelle für diese Seite: Quelle

Beliebte Programmiersprachen
Beliebte GitHub Projekte
Mehr GitHub Projekte

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