Question

Je suis analyse d'un fichier avec python et pyparsing (c'est le fichier de rapport pour SPAT Matlab, mais ce n'est pas important). est ce que j'ai jusqu'à présent. Je pense qu'il est un gâchis et aimerait avoir des conseils sur la façon de l'améliorer. Plus précisément, comment dois-je organiser mes définitions de grammaire avec pyparsing?

Dois-je avoir toutes mes définitions de grammaire dans une fonction? Si oui, il va être une fonction énorme. Sinon, comment puis-je le casser. En ce moment, je diviser les sections du fichier. Est-il la peine de faire des charges de fonctions qui ne se jamais appelé une fois d'un endroit. Ni se sent vraiment bien pour moi.

Dois-je placer tout mon entrée et le code de sortie dans un fichier séparé aux autres fonctions de classe? Il ferait l'objet de la classe beaucoup plus claire.

Je suis aussi intéressé de savoir s'il y a un moyen plus facile d'analyser un fichier, faire des contrôles de santé mentale et stocker les données dans une classe. Il me semble passer beaucoup de temps à faire cela.

(je vais accepter les réponses de il est assez bon ou utiliser X plutôt que pyparsing si les gens sont d'accord)

Était-ce utile?

La solution

Je pourrais aller de toute façon à l'aide d'une seule grande méthode pour créer votre analyseur par rapport à la prise dans les étapes de la façon dont vous l'avez maintenant.

Je vois que vous avez défini des utilitaires d'aide utiles, telles que fente ( « réprime littérales », je présume), stringtolits et decimaltable. Cela me semble bon.

J'aime que vous utilisez des noms de résultats, ils améliorent vraiment la robustesse de votre code post-analyse syntaxique. Je recommande d'utiliser le formulaire de raccourci qui a été ajouté dans pyparsing 1.4.7, dans lequel vous pouvez remplacer

busname.setResultsName("bus1")

avec

busname("bus1")

Cela peut désencombrer votre code un peu.

Je regarderais en arrière à travers vos actions parse pour voir où vous utilisez des index numériques pour accéder à des jetons individuels, et revenir en arrière et attribuer des noms de résultats à la place. Voici un cas où le rendement de getStats (ngroup + sgroup).setParseAction(self.process_stats). process_stats a des références comme:

self.num_load = tokens[0]["loads"]
self.num_generator = tokens[0]["generators"]
self.num_transformer = tokens[0]["transformers"]
self.num_line = tokens[0]["lines"]
self.num_bus = tokens[0]["buses"]
self.power_rate = tokens[1]["rate"]

J'aime que vous avez Group'ed les valeurs et les statistiques, mais allez-y et leur donner des noms, comme « réseau » et « soln ». Ensuite, vous pouvez écrire ce code d'action d'analyse syntaxique comme (je l'ai aussi converti au - me - plus facile à lire la notation-attribut objet au lieu de la notation élément dict):

self.num_load = tokens.network.loads
self.num_generator = tokens.network.generators
self.num_transformer = tokens.network.transformers
self.num_line = tokens.network.lines
self.num_bus = tokens.network.buses
self.power_rate = tokens.soln.rate

En outre, une question de style: pourquoi utilisez-vous parfois explicite et constructeur, au lieu d'utiliser l'opérateur « + »

busdef = And([busname.setResultsName("bus1"),
            busname.setResultsName("bus2"),
            integer.setResultsName("linenum"),
            decimaltable("pf qf pl ql".split())])

Ceci est tout aussi bien écrit:

busdef = (busname("bus1") + busname("bus2") + 
            integer("linenum") + 
            decimaltable("pf qf pl ql".split()))

Dans l'ensemble, je pense que c'est sur le point par un fichier de cette complexité. J'ai un format similaire (propriétaire, malheureusement, ne peut donc pas être partagée) dans lequel je construit le code en morceaux similaires à la façon dont vous avez, mais dans une grande méthode, quelque chose comme ceci:

def parser():
    header = Group(...)
    inputsummary = Group(...)
    jobstats = Group(...)
    measurements = Group(...)
    return header("hdr") + inputsummary("inputs") + jobstats("stats") + measurements("meas")

Les constructions du groupe sont particulièrement utiles dans un grand analyseur comme celui-ci, pour établir une sorte d'espace de noms pour les noms de résultats dans chaque section des données analysées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top