Muy bien, mi solución es poco eficiente comparada con la del profesor, pero antes de ponerla, explicaré un par de cosas importantes (tuve que ver la solución del profesor porque no entendía qué pasaba xD)
.
Mi idea era que, en program.statements
estaban guardados cada uno de los statements, por lo que basándome en la clase LetStatement
, debería tener un nombre disponible, así que mi idea era hacer esto:
self.assertEqual(program.statements[0].name, "x")
self.assertEqual(program.statements[1].name, "y")
self.assertEqual(program.statements[2].name, "foo")
Sin embargo, me salía un error de que name
no existía en el statement y yo estaba de “¡¿Cómo así que noe existe?! No tas viendo que ahí está definido dentro de la clase?”
.
Quería hacer prints desde los tests para debuguear, pero no podía usar la función print()
desde los tests, no se imprimía nada, de ahi descubrí que si quieres usar prints en los tests tienes que correr este comando:
mypy . && nosetests -s
Así se imprime lo que quiera debuguear, gracias a esto descrubrí que cada statement era un string, y por eso no estaba definida la propiedad name
… ¡Pues claro!, LetStatement
tiene el dunder method __str__
que hace que cada vez que se consulte una instancia de statement esta devuelva un string… revisando el código del profesor ví que el estaba usando una función llamada cast()
, no sé exactamente lo que hace pero intuyo que esa función convierte ese string generado por el dunder method a una instancia de LetStatement
, así que aplicándolo, llegue a esta conclusión:
self.assertEqual(cast(LetStatement, program.statements[0]).name, "x")
self.assertEqual(cast(LetStatement, program.statements[1]).name, "y")
self.assertEqual(cast(LetStatement, program.statements[2]).name, "foo")
Todo bien pero… en el atributo name se guarda una instancia de Identifier
, así que tenía que acceder a su value (propiedad de la clase Identifier
).
self.assertEqual(cast(LetStatement, program.statements[0]).name.value, "x")
self.assertEqual(cast(LetStatement, program.statements[1]).name.value, "y")
self.assertEqual(cast(LetStatement, program.statements[2]).name.value, "foo")
Pero soprresa, Identifier también tiene un dunder method xD Así que al final mi solución quedó así jaja:
self.assertEqual(cast(Identifier, cast(LetStatement, program.statements[0]).name).value, "x")
self.assertEqual(cast(Identifier, cast(LetStatement, program.statements[1]).name).value, "y")
self.assertEqual(cast(Identifier, cast(LetStatement, program.statements[2]).name).value, "foo")
Y solo hay que importar los módulos requeridos:
from typing import (
cast
)
from lpp.ast import (
Identifier,
LetStatement,
Program,
)
Después vi el código del profesor y el lo hizo con listas y bah! xD Al menos lo logré jaja, una hora para lograrlo:'D
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?