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
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?
Hilfreichster Kommentar
Interessiert es jemanden?