Salut,
Lors du remplacement de la variable s par une autre valeur u '\ xff' , ce test
[cas de test]
@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: le codec 'ascii' ne peut pas encoder les caractères en position 0-4: ordinal pas dans la plage (128)
[commentaires]
Le point bogué localise dans la fonction '_encode' de utils.py, vous ne devez pas simplement convertir le msg en str en utilisant 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
Quelqu'un s'en soucie?
Oui, il semble que changer return str(msg)
en return msg
résout le problème sans casser les tests. Mais pourquoi ce casting était-il nécessaire au départ?
Je ne suis pas absolument sûr qu'il soit logique de changer cela maintenant. Cela ne va absolument pas casser le code de qui que ce soit, mais cela vous permet essentiellement de puts
choses qui ne sont pas des chaînes et d'obtenir quelque chose de sensé:
>>> 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
Je suppose qu'il y a du code qui l'utilise (sans espoir de rechercher cela dans github, donc je ne vais pas essayer de chercher des exemples).
Je ne suis pas sûr que je pense qu'il est juste que le fait de ne pas avoir de jeu d'encodage et d'utiliser unicode fasse planter puts
, cependant.
Suspectez que le moyen le moins pire de résoudre ce problème pour le moment est simplement d'étendre la ligne incriminée dans ce bloc:
try:
return str(msg) # Original behavior added for 'reasons'
except UnicodeDecodeError:
return msg # Best-effort fallback
De cette façon, quelles que soient les raisons antédiluviennes que nous avions pour la conversion en chaîne continueront de fonctionner, mais le cas de buggy en discussion reviendrait à "eh bien, je ne sais pas ce que c'est, mais je ne peux pas str()
it , donc je vais juste le pousser dans le tuyau tel quel ".
J'ai rencontré un problème similaire lors de l'exécution de la méthode sudo
, et l'exception s'est produite à self.stream.write(text)
dans io.py
. Y a-t-il des progrès sur les problèmes Unicode?
Commentaire le plus utile
Quelqu'un s'en soucie?