De manière récursive convertir python objet graphique à dictionnaire

Je suis en train de convertir les données à partir d'un simple objet graphique dans un dictionnaire. Je n'ai pas besoin de saisir des informations ou des méthodes et je n'ai pas besoin d'être en mesure de convertir un objet nouveau.

J'ai trouvé cette question sur la création d'un dictionnaire à partir d'un objet de champs, mais il ne le fait pas de manière récursive.

Étant relativement nouveau pour python, je pense que ma solution est peut être moche, ou unpythonic, ou rompu en quelque manière obscure, ou tout simplement vieux NIH.

Ma première tentative est apparu à travailler jusqu'à ce que je l'ai essayé avec les listes et les dictionnaires, et il semblait plus facile de vérifier si l'objet passé en avait un dictionnaire interne, et si non, juste le traiter comme une valeur (plutôt que de faire tout ce qui isinstance de la vérification). Mes précédentes tentatives de ne pas répéter dans les listes des objets:

def todict(obj):
    if hasattr(obj, "__iter__"):
        return [todict(v) for v in obj]
    elif hasattr(obj, "__dict__"):
        return dict([(key, todict(value)) 
            for key, value in obj.__dict__.iteritems() 
            if not callable(value) and not key.startswith('_')])
    else:
        return obj

Cela semble mieux fonctionner et ne nécessite pas des exceptions, mais encore une fois je ne suis toujours pas sûr si il y a des cas ici, je ne suis pas au courant de l'endroit où elle tombe.

Toutes les suggestions seront très appréciés.

  • en python, il n'est pas si mal utiliser les exceptions et parfois, il peut simplifier le codage, un pythonic façon - l'aeap (plus Facile de Demander Pardon que la Permission)
  • cas particulier pourrait être lorsque l'objet a slots, édité répondre
  • point de pris, mais l'exception chose est un peu une guerre sainte, et j'ai tendance vers préférant ne jamais être jeté à moins que quelque chose est vraiment exceptionnelle, plutôt que d'attendre le flux du programme. chacune de leur propre sur celui-ci 🙂
  • oui surtout que c'est un style, mais parfois exception peut vraiment tout simplement le code par exemple, lors de l'intérieure de la plupart des fonctions de communiquer thru exceptions, et parfois il peut accélérer les choses si 99.99 % des objets ont dict, dans ce cas, au lieu de vérifier les 99,99% de temps de dict, de vérifier l'exception .01% du temps
InformationsquelleAutor Shabbyrobe | 2009-06-24