Pregunta

Estoy análisis de un archivo con el pitón y pyparsing (que es el archivo de informe para PSAT en Matlab, pero eso no es importante). aquí es lo que tengo hasta ahora. Creo que es un lío y me gustaría algún consejo sobre cómo mejorarla. Específicamente, ¿cómo debo organizar mis definiciones gramaticales con pyparsing?

¿Debo tener todos mis definiciones gramaticales en una función? Si es así, va a ser una función enorme. Si no es así, ¿cómo puedo romperlo. Por el momento he dividirlo en las secciones del archivo. ¿Vale la pena hacer un montón de funciones que sólo alguna vez serán llamadas vez de un lugar. Ninguno de los dos realmente se siente bien para mí.

¿Debo poner todo mi entrada y la salida código en un archivo separado de las otras funciones de clase? Esto haría que el propósito de la clase mucho más clara.

También me interesa saber si hay una manera más fácil de analizar un archivo, hacer algunas comprobaciones y almacenar los datos en una clase. Me parece que pasar mucho tiempo haciendo esto.

(voy a aceptar respuestas de Es lo suficientemente bueno o utiliza X en lugar de pyparsing si la gente de acuerdo)

¿Fue útil?

Solución

Yo podría ir en cualquier dirección sobre el uso de un método único grande como para crear un programa de análisis frente a tomarlo en los pasos de la manera que lo tienes ahora.

Puedo ver que usted ha definido algunas empresas de servicios auxiliares útiles, como la hendidura ( "suprimir literal", supongo), stringtolits y decimalTable. Esto se ve bien a mí.

Me gusta que está utilizando nombres resultados, que realmente mejoran la robustez de su código de post-análisis. Yo recomendaría el uso de la forma de acceso directo que se añadió en pyparsing 1.4.7, en la que se puede reemplazar

busname.setResultsName("bus1")

con

busname("bus1")

Esto puede suprimir elementos de su código un poco.

Me gustaría ver de nuevo a través de sus acciones de análisis sintáctico para ver dónde se está utilizando índices numéricos para acceder a las fichas individuales, y volver y asignar nombres en lugar de resultados. Este es un caso, en getstats vuelve (ngroup + sgroup).setParseAction(self.process_stats). process_stats tiene referencias como:

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

Me gusta que haya Group'ed los valores y las estadísticas, pero seguir adelante y darles nombres, como "red" y "Soln". Posteriormente, se podría escribir este código de acción de análisis como (También he convertido a la - me - más fácil de leer objeto-atributo notación en lugar de la notación elemento 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

Además, una cuestión de estilo: ¿por qué a veces se utiliza el constructor explícito y, en lugar de utilizar el operador '+'

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

Esta es la misma facilidad escrito:

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

En general, creo que esto es acerca del nivel de un archivo de esta complejidad. Tengo un formato similar (propietaria, por desgracia, por lo que no puede ser compartida) en la que he construido el código en piezas similares a la forma que tiene, pero en un método grande, algo como esto:

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

Las construcciones de grupo son especialmente útiles en un gran analizador de esta manera, establecer una especie de espacio de nombres para los nombres de los resultados dentro de cada sección de los datos analizados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top