Fabric: UnicodeEncodeError lors de l'appel met la fonction avec unicode u '\ xff' et le stream.encoding est None

Créé le 8 avr. 2015  ·  5Commentaires  ·  Source: fabric/fabric

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

Commentaire le plus utile

Quelqu'un s'en soucie?

Tous les 5 commentaires

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?

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

omzev picture omzev  ·  6Commentaires

shadyabhi picture shadyabhi  ·  5Commentaires

Grazfather picture Grazfather  ·  4Commentaires

26huitailang picture 26huitailang  ·  3Commentaires

peteruhnak picture peteruhnak  ·  4Commentaires
bleepcoder.com utilise des informations sous licence publique GitHub pour fournir aux développeurs du monde entier des solutions à leurs problèmes. Nous ne sommes pas affiliés à GitHub, Inc. ni à aucun développeur qui utilise GitHub pour ses projets. Nous n'hébergeons aucune des vidéos ou images sur nos serveurs. Tous les droits appartiennent à leurs propriétaires respectifs.
Source pour cette page: Source

Langages de programmation populaires
Projets GitHub populaires
Plus de projets 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.