Peut-être que c'est une question commune, mais je suis nouveau dans Python!
Je travaille sur certaines bibliothèques qui gèrent les requêtes JSON et me demandaient si des tonnes de codage de JSON ont des tonnes de codage rigide comme : P>
class _const:
class headers:
X_Auth_Token = "X-Auth-Token"
X_Username = 'X-Username'
X_Password = 'X-Password'
class params:
ID = "DocumentID"
Symbols = "Symbols"
ACRICode = "ACRICode"rketSegmentID"
entries = "entries"
depth = "depth"
date = "date"
meta = "meta"
timestamp = "timestamp"
message = "message"
# ...
4 Réponses :
Chaque dict imbriqué est un dict, vous pouvez stocker une référence à.
La performance doit être moins de vos préoccupations em>, la maintenabilité est plus importante. Une bonne raison d'utiliser un nom symbolique pour une chaîne est que vous ne pouvez pas le frapper facilement, cf vs p> an L'IDE ou un Linter peut trouver l'ancien typo et la mettre en surbrillance avant même d'exécuter le code, mais pas si probablement le dernier. P> En matière de performance, le code Python le plus performant est celui qui Est-ce que pas em> stocke des chaînes dans des variables. Lors de la compilation, les utilisations distinctes de la même chaîne dans le même module sont fusionnées pour référence à une constante de la chaîne: p> toujours, le point soulevé dans la réponse de Cheppner reste: vous n'avez pas besoin de résoudre inutilement les sous-documents de la racine. p> p>
Votre stratégie initiale suit Zen of Python très bien. C'est très lisible et quiconque utilise Python comprendra tout de suite. Votre deuxième exemple, cependant, est trop compliqué et difficile à comprendre.
Cela dit, il est possible de paquets JSON afin qu'il devient un objet avec des attributs au lieu d'un dict avec des clés. Votre code ressemblerait à quelque chose comme ceci: p> Alternativement, Définissez une classe simple qui prend en charge: P> import json
class x(object):
def __init__(self, j):
self.__dict__ = json.loads(j)
var1 = x.ACRI.message.title
var2 = x.ACRI.message.content
var3 = x.ACRI.message.meta.timestamp
Votre solution est très intéressante, je ne le savais pas et gardera l'esprit pour l'avenir, merci. La seule chose qui me fait du bruit, dans ce cas particulier, c'est si mon fournisseur de services apporte quelques changements API, je vais devoir modifier toutes les lignes de recherche de code source par ligne pour cet objet JSON.
Bon point. Vous voudrez peut-être envisager d'utiliser des constantes (voir PEP-8 ) , avec getattr () code>. Quelque chose comme var1_path = "acri.message.title"; var1 = réduire (getattr, nom.split ("."), x) code>
Si lire des données JSON à partir d'un fichier, utilisez l'extrait de code ci-dessous.
with open("config.json") as json_data_file:
json_text = json_data_file.read()
json_data = json.loads(json_text, object_hook=lambda d: namedtuple('X', d.keys())(*d.values()))
# Access data using below format
var1 = json_data.key1.subkey1
var2 = json_data.key2.subkey2