Domanda

Io sono l'analisi di un file con Python e pyparsing (è il file di report per PSAT in Matlab, ma questo non è importante). qui è quello che ho finora. Penso che sia un disastro e vorrei qualche consiglio su come migliorarlo. In particolare, come devo organizzare le mie definizioni di grammatica con pyparsing?

Dovrei avere tutte le mie definizioni di grammatica in una funzione? Se è così, sarà una funzione enorme. Se no, allora come faccio a disgregare. Al momento ho dividerlo in sezioni del file. Vale la pena di fare un sacco di funzioni che sempre e solo una volta che vengono chiamati da un luogo. Nessuno dei due si sente davvero giusto per me.

Devo mettere tutto il mio ingresso e di uscita codice in un file separato alle altre funzioni di classe? Sarebbe la fine della classe molto più chiara.

Mi interessa sapere se c'è un modo più semplice per analizzare un file, effettuare alcuni controlli di integrità e memorizzare i dati in una classe anche. Mi sembra di spendere un sacco di tempo a fare questo.

(Accetterò risposte di è abbastanza buono o usare X piuttosto che pyparsing se le persone sono d'accordo)

È stato utile?

Soluzione

Potrei andare in entrambi i modi di utilizzare un unico metodo grande per creare il parser vs. prenderlo in passi il modo in cui lo avete ora.

Vedo che avete definito alcune utility di supporto utili, come fessura ( "sopprimere letterale", presumo), stringtolits e decimaltable. Questo sembra buono per me.

mi piace che si sta utilizzando Risultati nomi, in realtà migliorare la robustezza del codice post-analisi. Ti consiglio di utilizzare il modulo di collegamento che è stato aggiunto nel pyparsing 1.4.7, in cui è possibile sostituire

busname.setResultsName("bus1")

con

busname("bus1")

Questo può declutter il codice un po '.

Vorrei guardare indietro attraverso le vostre azioni Analizza per vedere dove si sta utilizzando gli indici numerici per accedere ai singoli gettoni, e tornare indietro e assegnare nomi risultati invece. Qui è un caso, in cui i rendimenti GetStats (ngroup + sgroup).setParseAction(self.process_stats). process_stats ha riferimenti come:

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"]

Mi piace che avete Group'ed i valori e le statistiche, ma andare avanti e dare loro un nome, come "rete" e "soln". Poi si potrebbe scrivere questo codice di azione parse come (ho anche convertito per il - per me - più facile da leggere object-attribute notazione invece di elemento dict notazione):

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

Inoltre, una domanda stile:? Perché ti a volte usa la esplicita e costruttore, invece di utilizzare l'operatore '+'

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

Questa è la stessa facilità con scritto:

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

Nel complesso, credo che questo è circa il par per un file di questa complessità. Ho un formato simile (proprietario, purtroppo, così non può essere in comune), in cui ho costruito il codice in pezzi simili al modo in cui si dispone, ma in un metodo di grandi dimensioni, qualcosa di simile a questo:

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

I costrutti del Gruppo sono particolarmente utili in una grande parser come questo, di stabilire una sorta di spazio dei nomi per i nomi risultati all'interno di ogni sezione dei dati analizzati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top