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.
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é.
attrdict using JSON keys as python attributes in nested JSON soundcloud-python/resource.py Sample on Gist
Recommended Posts