IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Représentation des chaînes unicode Python 3 au format Python 2.x (avec préfixe u)


Sujet :

Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Représentation des chaînes unicode Python 3 au format Python 2.x (avec préfixe u)
    Bonjour,

    Vous savez probablement tous qu’une chaîne de caractères unicode dans Python 2.7 s’écrit avec le symbole u avant ladite chaîne.

    Par exemple,
    u"Ceci est ma chaîne de caractères unicode"
    En python 3.3, ce préfixe u n’est plus nécessaire (il est même interdit avec Python 3.0, 3.1 et 3.2), et on écrit :
    "Ceci est ma chaîne de caractères unicode"
    Je programme en Python 3.3 qui, pour les raisons de rétrocompatibilité, supporte les deux écritures (on peut mettre ou non le préfixe u, c’est indifférent).

    Je manipule souvent des listes et des dictionnaires qui comportent des chaînes de caractères, et je voudrais, lorsque je demande la représentation de ces objets que Python 3.3 ajoute automatiquement ce préfixe u avant les chaînes.

    Par exemple, si je demande de m’afficher une liste, Python 3.3 va écrire :
    ["chaîne1", "chaîne2", "chaîne3", "chaîne4"]
    Là où Python 2.x afficherait :
    [u"chaîne1", u"chaîne2", u"chaîne3", u"chaîne4"]
    Comment puis-je obtenir une représentation des chaînes selon Python 2.x avec Python 3.3 ?

    Merci d’avance pour toute aide.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    "print (object)" ne devrait s'utiliser que pour du "debug".
    Accepter 'u' devant les littéraux pour simplifier la migration de codes v2 évite du travail: c'est cool.
    Par contre, si Python3 ne préfixe plus les "str" unicode par un "u", il préfixe les "bytes" par 'b': côté DEBUG, vous avez ce qu'il faut.

    Après ce n'est que de la programmation, çà peut se faire...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Dans la mesure où il s'agit uniquement d'un problème d'affichage, on peut toujours créer la chaine qu'on veut, et pourquoi pas avec des 'u':

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    def chupy2(L):
        """pour affichage d'une liste de chaines unicode Python 2"""
        ch = "["
        if L!=[]:
            for chaine in L:
                ch += 'u"' + chaine + '", '
            ch = ch[:-2]
        return ch + "]"
     
     
    L = ["chaîne1", "chaîne2", "chaîne3", "chaîne4"]
     
    print(chupy2(L))
    Ce qui affiche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [u"chaîne1", u"chaîne2", u"chaîne3", u"chaîne4"]
    Dans le cas général d'un arbre de profondeur quelconque (liste de liste de liste...), ça se complique un peu (fonction récursive) mais ça se fait aussi. On peut aussi traiter le cas de données hétérogènes (chaines, entiers, flottants, dictionnaire, etc...)
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    "print (object)" ne devrait s'utiliser que pour du "debug".
    On ne choisit pas toujours le code sur lequel on bosse.
    En fait, il ne s’agit pas de print mais qu’importe, il se trouve que la représentation des objets est dumpée dans des fichiers de code qui sont lus par un interpréteur Python 2 ou 3. Il faut donc que ce soit compatible.

    Accepter 'u' devant les littéraux pour simplifier la migration de codes v2 évite du travail: c'est cool.
    Oui, mais ici c’est l’inverse. On ne migre pas du code vers v3, on génère du code avec Python 3 qui doit être rétrocompatible pour certaines parties avec Python 2.

    Il ne s’agit pas de débuguer. La notation u est nécessaire.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Citation Envoyé par tyrtamos Voir le message
    Dans le cas général d'un arbre de profondeur quelconque (liste de liste de liste...), ça se complique un peu (fonction récursive) mais ça se fait aussi. On peut aussi traiter le cas de données hétérogènes (chaines, entiers, flottants, dictionnaire, etc...)
    Oui, en fait, les objets sont hétérogènes et assez complexes : dictionnaires de listes de dictionnaires et des choses de ce genre.

    En fait, je posais la question pour savoir s’il existait une option bête à activer pour obtenir la notation des chaînes adéquate, avant de me lancer à écrire un script compliqué juste pour ajouter ces foutus u un peu partout. En fait, le problème, c’est qu’on a aussi des chaînes avec potentiellement des guillemets à l’intérieur, c’est un peu casse-gueule en fait.

    Ou bien je vais peut-être envisager de générer ces cas particuliers avec Python 2.7.

    Mais, s’il existe une solution simple pour retrouver la notation ancienne avec Python 3.3, ça éviterait de pondre une usine à gaz juste pour gérer ces spécificités.

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par while Voir le message
    On ne choisit pas toujours le code sur lequel on bosse.
    En fait, il ne s’agit pas de print mais qu’importe, il se trouve que la représentation des objets est dumpée dans des fichiers de code qui sont lus par un interpréteur Python 2 ou 3. Il faut donc que ce soit compatible.

    Je comprends: postez votre question aux développeurs ou allez lire le code "C" avant de fermer cette piste.
    A ma connaissance, il n'y a pas de "switch" magique pour çà et il faut coder.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Je ne connais pas de fonction simple capable de faire ça.

    Juste une idée: il existe un code "2to3" pour passer de Python 2 à Python 3. Mais on parle ici et là de code "3to2" pour faire le contraire: https://docs.python.org/3.2/howto/py...hon-3-and-3to2. Peut-être faudrait-il regarder ce qu'il y a dedans pour s'en inspirer?

    Sinon, si tu es coincé, j'utilise souvent le genre de code que tu cherches pour afficher n'importe quel objet Python hétérogène (int, long, float, complex, str, unicode, list, tuple, dict, set, frozenset) avec le bon encodage sur n'importe quel console de sortie. Je n'ai jamais mis de 'u' mais ça peut se faire. Je peux t'en faire profiter, mais c'est un assez gros code (plus de 200 lignes), et il est écrit en Python 2.7 pour l'instant. Et c'était nécessaire pour Python 2, parce que l'affichage de chaines situées dans une liste était vraiment moche:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print [u"éèçàùôï"]
    [u'\xe9\xe8\xe7\xe0\xf9\xf4\xef']
    Ça s'est arrangé, heureusement, avec Python 3.
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci pour les réponses et les pistes.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. REGEX-Repérer des chaînes simples à la sauce Python
    Par rambc dans le forum Général Python
    Réponses: 5
    Dernier message: 12/01/2012, 10h16
  2. Requête dynamique avec des chaînes Unicodes
    Par Adorien dans le forum Développement
    Réponses: 4
    Dernier message: 15/05/2008, 11h35
  3. [D6] Comment remplacer des chaînes dans un fichier ?
    Par fabien25 dans le forum Langage
    Réponses: 4
    Dernier message: 15/06/2005, 13h37
  4. Passage des chaînes de caractères à une application CGI
    Par Thom@s dans le forum Composants VCL
    Réponses: 10
    Dernier message: 03/12/2004, 00h13
  5. [Normes] représentation des pourcentages
    Par Bowen dans le forum Décisions SGBD
    Réponses: 6
    Dernier message: 19/10/2004, 14h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo