399 votes

Pour accéder aux dict clés comme un attribut en Python ?

Je trouve ça plus conviant à dict touches d’accès rapide comme au lieu de , j’ai donc écrit cet extrait :

Cependant, je suppose qu’il doit y avoir une raison quelconque que Python ne fournit pas cette fonctionnalité out of the box. Quelles seraient les mises en garde et les pièges d’accéder aux clés de dict de cette manière ?

398voto

Kimvais Points 12453

La meilleure façon de le faire est:

class AttrDict(dict):
    def __init__(self, *args, **kwargs):
        super(AttrDict, self).__init__(*args, **kwargs)
        self.__dict__ = self

Quelques avantages:

  • Il fonctionne réellement!
  • Aucun dictionnaire, les méthodes de la classe sont occultées (par exemple, .keys() fonctionnent très bien)
  • Les attributs et les éléments sont toujours synchronisés
  • La tentative d'accès non-existant clé comme un attribut correctement soulève AttributeError au lieu de KeyError

Inconvénients:

  • Pour le non-initié, il semble comme de la pure magie.
  • Provoque une fuite de mémoire dans Python < 2.7.3 / Python3 < 3.2.3
  • Pylint va bananes à l'aide d' E1123(unexpected-keyword-arg) et E1103(maybe-no-member)

Une courte explication sur la façon dont cela fonctionne

  • Tous les objets python en interne pour stocker leurs attributs dans un dictionnaire qui est nommé __dict__.
  • Il n'est pas nécessaire que le dictionnaire interne __dict__ auraient besoin d'être "juste une plaine dict", donc on peut attribuer n'importe quelle sous-classe de la dict() pour le dictionnaire interne.
  • Dans notre cas, il nous suffit d'attribuer l' AttrDict() exemple nous sommes de l'instanciation (comme nous sommes en __init__).
  • En appelant super()s' __init__() méthode nous avons fait en sorte qu'il (déjà) se comporte exactement comme un dictionnaire, depuis que les appels de fonction tous le dictionnaire de l'instanciation de code.

129voto

Hery Points 1097

Vous pouvez avoir tous les caractères de la chaîne judiciaire dans le cadre de la clé si vous utilisez la notation de tableau. Par exemple,``

89voto

slacy Points 4417

De cette autre question si il y a un exemple de grande application qui simplifie votre code existant. Qu’en est-il :

Beaucoup plus concis et ne laisse pas n’importe quelle pièce pour cruft supplémentaire dans votre et les fonctions à l’avenir.

23voto

Ryan Points 318

Caveat emptor : pour certaines classes de raisons comme ceci semblent briser le paquet multitraitement. J’ai lutté juste avec ce bug pour un certain temps avant de trouver ce SO : recherche d’exception en multitraitement python

18voto

The Communist Duck Points 2700

Que se passe-t-il si vous vouliez une clé qui est une méthode, tels que ou ?

Et vous ne seriez pas en mesure d’avoir une entrée qui n’a pas commencer par une lettre, donc, en utilisant `` comme une clé est sorti.

Et que se passe-t-il si vous ne voulez pas utiliser une chaîne ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X