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 :

Problème le type dict: mélange de mes données


Sujet :

Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 8
    Points : 6
    Points
    6
    Par défaut Problème le type dict: mélange de mes données
    Bonjour à tous,

    Voici mon problème. Je réalise un petit navigateur qui utilise le module httplib. Jusque là aucun problème, voici une partie de mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    import httplib
     
    header = dict();
    header["User-Agent"] =  "MonNav"
    header["Accept-Encoding"] = "gzip,deflate"
    header["Keep-Alive"] = "300"
    header["Connection"] = "keep-alive"
     
    conn = httplib.HTTPConnection("google.com")
    #c'est ici que je passe header en paramètre
    conn.request ("GET" , "/index.html", None, header) 
    r1 = conn.getresponse()
    print r1.status, r1.reason
    data1 = r1.read()
    conn.close()
    Après quelques redirections je récupère correctement mon 200 OK.
    Le problème est que lorsque j'observe la communication avec mon sniffer (Wireshark), je remarque que les lignes du header ne sont pas du tout dans le bon ordre! Evidemment j'aurais pu le voir avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    print header
    {'Keep-Alive': '300', 
    'Connection': 'keep-alive',
     'Accept-Encoding': 'gzip,deflate',
     'User-Agent': 'MonNav'}
    Je suis tout à fait d'accord sur le fait que celà ne gène pas le fonctionnement de mon navigateur, du côté du serveur ces variables sont sans doute bien récupérées. Mais puisque je tente de me baser sur les données sniffées de firefox, celà me pose un réel problème de lisibilité. J'aimerais vraiment que ces lignes ne se mélangent pas! Sinon j'aurai vite fait d'oublier une ligne par-ci par-là.

    Je suis allé lire la doc de python et voilà ce qu'on y trouve :

    Note

    Keys and values are listed in an arbitrary order which is non-random, varies across Python implementations, and depends on the dictionary’s history of insertions and deletions. If items(), keys(), values(), iteritems(), iterkeys(), and itervalues() are called with no intervening modifications to the dictionary, the lists will directly correspond. This allows the creation of (value, key) pairs using zip(): pairs = zip(d.values(), d.keys()). The same relationship holds for the iterkeys() and itervalues() methods: pairs = zip(d.itervalues(), d.iterkeys()) provides the same value for pairs. Another way to create the same list is pairs = [(v, k) for (k, v) in d.iteritems()].
    C'est la seule note que j'ai trouvée sur toute cette histoire d'ordre dans la liste retournée par un dict...

    J'ai pensé à utiliser autre chose qu'un type dict mais la fonction HTTPConnection.request() demande un argument de type dict obligatoirement.

    The header argument should be a mapping of extra HTTP headers to send with the request.
    Or, et c'est peut être là que je me trompe, il me semble que le seul dans ce cas est le type dict.

    Une solution? Merci d'avance!

  2. #2
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Décembre 2007
    Messages
    758
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations professionnelles :
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2007
    Messages : 758
    Points : 970
    Points
    970
    Par défaut
    bonjour,

    Or, et c'est peut être là que je me trompe, il me semble que le seul dans ce cas est le type dict.
    à ma connaissance, le type dict est le seul type de "mapping" dans python.
    si tu veux absolument avoir un ordre, une solution peut être d'inscrire les clés du dictionnaire dans un conteneur qui lui est ordonné (comme une liste).

    ou alors tu peux créer une classe dérivée de dict qui implémente elle même cette liste pour avoir un ordre, en faisant en sorte, par exemple que la méthode __setitem__ du dictionnaire fasse aussi un append dans une liste.

    par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class DictionnaireOrdonne(dict):
        def __init__(self):
            dict.__init__(self)
            self._list = []
        def __setitem__(self, key, value):
            self._list.append(key)
            dict.__setitem__(self,key,value)
        def itervalues(self):
            for key in self._list:
                yield self[key]
    voilà, il manque pas mal de méthodes à surcharger mais c'est un exemple

  3. #3
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Points : 1 658
    Points
    1 658

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 8
    Points : 6
    Points
    6
    Par défaut
    Un grand merci pour vos réponces rapides et pertinentes!
    Je considère le problème comme résolu au vu de l'article sur les "Ordered Dictionaries". Peut-être à rajouter dans la faq?

    ...

    Et vive developpez.net !

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

Discussions similaires

  1. [C#] problème de type donnée entre Service Web
    Par Cédric B. dans le forum Services Web
    Réponses: 1
    Dernier message: 01/11/2007, 01h19
  2. Problème pour sauvegarder mes données
    Par ploup dans le forum Windows Forms
    Réponses: 5
    Dernier message: 04/05/2007, 14h17
  3. Problème pour récupérer mes données XP sous Vista
    Par tortuegeniale65 dans le forum Windows Vista
    Réponses: 3
    Dernier message: 02/05/2007, 19h40
  4. Problème avec type de données
    Par yancimer dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 21/09/2006, 16h54
  5. Réponses: 4
    Dernier message: 09/05/2006, 10h29

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