-1
votes

Comment éviter des tonnes de codage rigide de cordes de clé dict en python

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"
        # ...


0 commentaires

4 Réponses :


0
votes

Chaque dict imbriqué est un dict, vous pouvez stocker une référence à. XXX


0 commentaires

1
votes

La performance doit être moins de vos préoccupations , 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 xxx

vs xxx

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.


En matière de performance, le code Python le plus performant est celui qui Est-ce que pas 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: xxx

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.


0 commentaires

1
votes

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> xxx pré>

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


2 commentaires

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 () . Quelque chose comme var1_path = "acri.message.title"; var1 = réduire (getattr, nom.split ("."), x)



0
votes

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


0 commentaires