Wattazoum’s Website
Accueil du site > Professionnel > Projets Personnels > Petit cours de Python ;-)

Petit cours de Python ;-)

mardi 5 juin 2007, par Oumar-Aziz Ouattara

Toujours pendant le projet sbackup OOP , je me suis trouvé face à un pépin que j’exposerais et la résolution m’a été offerte gracieusement sur un forum python (vive Gmane) ...

Bonjour,

Je vous exposerais donc les mails passés sur Gmane (gmane.comp.python.french) [1]

Mail d’origine

Bonjour,

Je suis nouveau sur cette liste et j’espère trouver de l’aide mais aussi aider d’autre si j’en ai la possibilité . :-)

Alors, et cette question à 100 points ?!

Context :
*******

Je développe actuellement une version refactoré de Sbackup ( que j’ose appeler OOP ... mais là n’est pas le débat ) http://sbackup.sourceforge.net/HomePage . Dans le cadre de cette application , pour une gestion efficace de la mémoire , j’ai imaginé une structure, dérivant de la classe "dict" . Pour plus d’info lire http://tinyurl.com/2j8gun

Problème :
*********

Si vous voulez tester la classe SBdict vous verrez qu’elle se comporte comme un dictionnaire. Dans cette optique, je voudrais surcharger aussi la méthode "iteritems()" . Et c’est là qu’est le problème : Le principe serait le suivant, j’itère en profondeur jusqu’à tomber sur "None" puis j’itère 1 fois en -largeur- (je ne sais pas exactement quel terme utilisé) puis de nouveau en profondeur et ainsi de suite .

Le problème c’est que je n’arrive pas à trouver de documentation sur les itérateurs qui vont dans ce sens, aussi je me tourne vers vous pour éclairer ma lanterne :-)

Cordialement
wattazoum

Réponse un jour après

il suffit de faire une méthode iteritems récursive (ce qui est classique dans le cas de parcours d’arbres comme celui que tu présentes). La condition d’arrêt de récursion sera la présence d’un None.

exemple (sous forme de fonction)

import os

def iteritems(sbdict, _path=None):
   if _path is None:
       _path = []
   for dirname,(props, contents) in sbdict.iteritems():
       _path.append(dirname)
       if contents is None:
           yield os.sep.join(_path)
           _path.pop()
       else:
           for path in iteritems(contents, _path):
               yield path

for path in iteritems(d):
   print path

Ca répond à ta question ?


Alexandre Fayolle LOGILAB, Paris (France)
Formations Python, Zope, Plone, Debian :
http://www.logilab.fr/formations
Développement logiciel sur mesure : http://www.logilab.fr/services
Informatique scientifique : http://www.logilab.fr/science
Reprise et maintenance de sites CPS : http://www.migration-cms.com/

Merci Alexandre :-)

Comme quoi, internet et les communautes sont une grande source de savoir et de richesse.

P.-S.

Referez vous a Utilisation Optimisée de la Mailing List Ubuntu pour plus d’infos sur Gmane

Notes

[1] je ne serais jamais allé m’inscrire aussi facilement sur une mailing liste si ce n’était l’existence de Gmane.

Répondre à cet article

SPIP | squelette | | Plan du site | Suivre la vie du site RSS 2.0