Autoriser l'accès aux attributs à Python dict

Motivation

En Python, contrairement à JavaScript, vous ne pouvez pas accéder aux éléments du dictionnaire avec Attribute. Autrement dit, dict_obj [" value "] est OK, mais pas dict_obj.value.

L'inconvénient est lorsque vous travaillez avec des données Json. Après tout, du côté JavaScript, il est accessible avec Attribute, c'est donc la nature humaine de vouloir écrire de la même manière.

C'est pourquoi je vais vous montrer comment accéder au dict (en supposant un objet Json cette fois) avec un attribut.

la mise en oeuvre

En Python, le chargement de Json en fait un dictionnaire.

>>> import json
>>> json.loads('{"v1":"xxxx", "v2":"vvvv"}')
{'v1': 'vvvv', 'v2': 'xxxx'}

Comme mentionné ci-dessus, lors de l'accès, ce sera sous la forme de ʻobj ["v1"] ʻ et ʻobj.vi` sera NG.

Le moyen le plus simple de résoudre ce problème est d'utiliser une bibliothèque appelée attrdict.

Cependant, si vous ne souhaitez pas l'installer, vous pouvez utiliser la méthode simple suivante. Lorsque vous faites json.loads, utilisez ʻobject_hook pour envelopper chaque objet dans une classe qui implémente l'accès aux attributs ( getattr`). Vous pouvez maintenant accéder à l'élément via Attribute.

import json

class AttributeDict(object):
    def __init__(self, obj):
        self.obj = obj

    def __getstate__(self):
        return self.obj.items()

    def __setstate__(self, items):
        if not hasattr(self, 'obj'):
            self.obj = {}
        for key, val in items:
            self.obj[key] = val

    def __getattr__(self, name):
        if name in self.obj:
            return self.obj.get(name)
        else:
            return None

    def fields(self):
        return self.obj

    def keys(self):
        return self.obj.keys()

if __name__ == "__main__":
    attribute_json = json.loads('{"v1":"xxxx", "v2":"vvvv"}', object_hook=AttributeDict)
    print("attribute_json.v1 = {0}".format(attribute_json.v1))

    json_with_array = json.loads('{"arr":[{"v":"xxxx"}, {"v":"vvvv"}]}', object_hook=AttributeDict)
    print("json_with_array[0].v = {0}".format(json_with_array.arr[0].v))

Résultat d'exécution

attribute_json.v1 = xxxx
json_with_array[0].v = xxxx

Si vous pouvez accéder à Attribute, vous pourrez compléter le code, il sera donc plus facile à implémenter. Je l'ai essayé.

référence

attrdict using JSON keys as python attributes in nested JSON soundcloud-python/resource.py Sample on Gist

Recommended Posts

Autoriser l'accès aux attributs à Python dict
python / Créer un dict à partir d'une liste.
Rendre les dictionnaires Python accessibles en tant qu'attributs
Alternative: rendre les dictionnaires Python accessibles en tant qu'attributs
[Python] [R] Rendre le GPU reconnu par tensorflow-2.x
Zone Python Dict
Alias d'attribut Python
Jugement des nombres premiers par Python
Traitement de la communication par Python
Comment obtenir l'accès par attribut et la conservation de l'ordre d'insertion dans Python dict
[Python] Récupère l'élément en spécifiant l'attribut name dans BeautifulSoup
Réponse de Beamformer par python
[Python] Comment créer une liste de chaînes de caractères caractère par caractère
Reconnaissance vocale par Python MFCC
Trier par valeur de valeur de type dict
Comment utiliser __dict__ en Python
API Web EXE par Python
Rendre MeCab disponible à partir de Python 3
Programme de formation des nouveaux arrivants par Python
Paramétrage par le configurateur python
Ordre de tri des dict de base Python
Pin python géré par conda
Utiliser un dict clé de liste en Python
Rendre Jupyter Lab accessible à distance
Créez Puyopuyo AI avec Python
Ne faites pas test.py en Python!
Extraction de mots-clés par MeCab (python)
Séparez les nombres par 3 chiffres (python)
Créer un bookmarklet en Python
Faites une loterie avec Python
Rendre Opencv disponible en Python
Modèle de commutation de Markov par Python
Segfo python en 2 lignes
Traitement d'image par python (Pillow)
Python lancé par des programmeurs C
Jugement de la plateforme (OS) par Python
Trier par date en python
Rejoignez CSV normalisé par les pandas Python pour faciliter la vérification