DOT DSL

DOT DSL

Intermedia

Instrucciones

Un lenguaje específico de dominio (DSL) es un lenguaje pequeño optimizado para un dominio específico. Como un DSL está enfocado, puede mejorar mucho la productividad y la comprensión, ya que permite a quien lo escribe declarar qué quiere en lugar de cómo.

Una de las áreas problemáticas donde se aplican son las personalizaciones y configuraciones complejas.

Por ejemplo, el lenguaje DOT te permite escribir una descripción textual de un grafo que luego se transforma en una imagen con alguna de las herramientas de Graphviz (como dot). Un grafo simple se ve así:

graph {
    graph [bgcolor="yellow"]
    a [color="red"]
    b [color="blue"]
    a -- b [color="green"]
}

Si pones esto en un archivo example.dot y ejecutas dot example.dot -T png -o example.png, se crea una imagen example.png con un círculo rojo y uno azul conectados por una línea verde sobre un fondo amarillo.

Escribe un lenguaje específico de dominio similar al lenguaje dot de Graphviz.

Nuestro DSL se parece al lenguaje dot de Graphviz en que se usará para crear estructuras de datos de grafos. Sin embargo, a diferencia del lenguaje DOT, nuestro DSL será un DSL interno que se usará solo en nuestro lenguaje.

Aprende más sobre la diferencia entre los DSL internos y externos.

Descripción del DSL

Un grafo, en este DSL, es un objeto de tipo Graph. Este recibe una list de una o más tuplas que describen:

  • atributos
  • Nodes
  • Edges

Las implementaciones de un Node y una Edge se proporcionan en dot_dsl.py.

Para más detalles sobre el diseño esperado del DSL y los tipos de error y mensajes esperados, revisa los casos de prueba en dot_dsl_test.py

Mensajes de excepción

A veces es necesario lanzar una excepción. Cuando lo hagas, siempre debes incluir un mensaje de error significativo que indique cuál es el origen del error. Esto hace que tu código sea más legible y ayuda mucho con el debug. En situaciones en las que sabes que el origen del error será de cierto tipo, puedes elegir lanzar uno de los tipos de error integrados, pero aun así debes incluir un mensaje significativo.

Este ejercicio en particular requiere que uses la sentencia raise para «lanzar» un TypeError cuando un Graph está mal formado, y un ValueError cuando un Edge, un Node o un attribute está mal formado. Las pruebas solo pasarán si tanto haces raise de la exception como incluyes un mensaje con ella.

Para lanzar un error con un mensaje, escribe el mensaje como argumento del tipo exception:

# Graph is malformed
raise TypeError("Graph data malformed")

# Edge has incorrect values
raise ValueError("EDGE malformed")

Fuente

WikipediaEl enlace se abre en una ventana o pestaña nueva
Editar en GitHub El enlace se abre en una ventana o una pestaña nuevas
Python Exercism

¿Todo listo para empezar DOT DSL?

Regístrate en Exercism para aprender y dominar Python con 17 conceptos146 ejercicios y mentoría humana real, todo gratis.