fork download
  1. # Examen ALS final(parcial 2) 2018/19 MIT License Baltasar <jbgarcia@uvigo.es>
  2.  
  3.  
  4. """
  5. 1. (4pts.) La clase AlumnoALS alberga las notas de un alumno de ALS. Se contruye con un nombre y tres notas: la del parcial 1, la del parcial 2, y la del proyecto. Los métodos de esta clase serán exactamente __init__(), __getattr__() y __str__(). Aún así, será capaz de responder a la petición de varias “propiedades”: notas devuelve una nueva lista con las tres notas, parcial1 devolverá la nota del primer parcial, parcial2 la del segundo, y proyecto la del proyecto. El “método” calcula_nota_final_parciales() calcula la media de los dos parciales y la multiplica por 0.6. El “método” calcula_nota_final_proyecto() multiplica la nota del proyecto por 0.4. El “método” calcula_nota_final() devolverá la nota media ponderada: 0.6 * ((parcial1 + parcial2) / 2) + 0.4 * proyecto. El método __str__() devolverá la información en el formato <nombre>: 0.6 * ((<parcial1> + <parcial2>) / 2) + 0.4 * <proyecto> = <parciales> + <proyecto> = <nota_final>, como por ejemplo: Baltasar: 0.6 * ((10 + 10) / 2) + 0.4 * 10 = 6 + 4 = 10.
  6.  
  7. a1 = AlumnoALS(“Baltasar”, [10, 10, 10])
  8. print(a1.notas[0], a1.parcial1, a1.notas[1], a1.parcial2) # 10 10 10 10
  9. print(a1.calcula_nota_final_proyecto()) # 4
  10. print(a1.calcula_nota_final()) # 10
  11. print(a1) # Baltasar: 0.6 * ((10.00 + 10.00) / 2) + 0.4 * 10.00 = 6.00 + 4.00 = 10
  12.  
  13.  
  14. 2. (2pts.) Cree los métodos to_json(f) y from_json(f). El primero escribe la codificación JSON del objeto como un archivo, la segunda toma un archivo con contenido en formato JSON y crea un objeto con dicho contenido.
  15.  
  16. 3. (4pts.) Escriba la función lambda nota_proyecto(a). Esta función recibe un objeto AlumnoALS y devuelve un texto con el formato: “<nombre>: <nota_proyecto>”, por ejemplo: “Baltasar: 10.00”. Escriba la función lambda lista_alumnos(la, f), que recibe como parámetros una lista de alumnos y una función que devolverá un texto por cada alumno que se le pase. Debe devolver un texto compuesto por todos los resultados de llamar a f en los objetos de la lista la. Componga ambas funciones para devolver un listado de las notas del proyecto de los alumnos.
  17.  
  18. listado = lista_alumnos([a1, a2], nota_proyecto))
  19. print(resultado)
  20.  
  21. Baltasar: 10.00
  22. Cantinflas: 7.00
  23.  
  24. """
  25.  
  26.  
  27. import json
  28.  
  29.  
  30. class AlumnoALS:
  31. def __init__(self, nombre, notas):
  32. self._nombre = nombre
  33. self._notas = list(notas)
  34.  
  35. def __getattr__(self, s):
  36. if s == "nombre":
  37. return self._nombre
  38. elif s == "notas":
  39. return list(self._notas)
  40. elif s == "parcial1":
  41. return self._notas[0]
  42. elif s == "parcial2":
  43. return self._notas[1]
  44. elif s == "proyecto":
  45. return self._notas[2]
  46. elif s == "calcula_nota_final_parciales":
  47. return lambda: ((self._notas[0] + self._notas[1]) / 2) * .6
  48. elif s == "calcula_nota_final_proyecto":
  49. return lambda: self._notas[2] * .4
  50. elif s == "calcula_nota_final":
  51. return lambda: self.calcula_nota_final_parciales() + self.calcula_nota_final_proyecto()
  52. else:
  53. raise AttributeError(s)
  54.  
  55. def __str__(self):
  56. return str.format("{}: 0.6 * (({:5.2f} + {:5.2f}) / 2) + 0.4 * {:5.2f} = {:5.2f} + {:5.2f} = {:5.2f}",
  57. self.nombre,
  58. self.parcial1,
  59. self.parcial2,
  60. self.proyecto,
  61. self.calcula_nota_final_parciales(),
  62. self.calcula_nota_final_proyecto(),
  63. self.calcula_nota_final())
  64.  
  65. def to_json(self, f):
  66. return json.dump(self.__dict__, f)
  67.  
  68. @staticmethod
  69. def from_json(f):
  70. toret = AlumnoALS("", [])
  71. toret.__dict__ = json.load(f)
  72. return toret
  73.  
  74.  
  75. nota_proyecto = lambda a: str.format("{}: {:5.2f}\n", a.nombre, a.parcial1)
  76. lista_alumnos = lambda la, f: ("" if not la or la == []
  77. else f(la[0]) + lista_alumnos(la[1:], f))
  78.  
  79.  
  80.  
  81. import io
  82. import unittest
  83.  
  84.  
  85. class TestAlumnoALS(unittest.TestCase):
  86. def setUp(self):
  87. self.notas_alumno1 = [10, 10, 10]
  88. self.datos_alumno1 = {"_nombre": "Baltasar", "_notas": self.notas_alumno1}
  89. self.alumno1 = AlumnoALS("Baltasar", self.notas_alumno1)
  90.  
  91. def testAlumno1(self):
  92. self.assertEqual("Baltasar", self.alumno1.nombre)
  93. self.assertEqual(self.notas_alumno1, self.alumno1.notas)
  94. self.assertEqual("Baltasar: 0.6 * ((10.00 + 10.00) / 2) + 0.4 * 10.00 = 6.00 + 4.00 = 10.00", str(self.alumno1))
  95.  
  96. def testParciales(self):
  97. self.assertEqual(self.notas_alumno1[0], self.alumno1.notas[0])
  98. self.assertEqual(self.notas_alumno1[1], self.alumno1.notas[1])
  99. self.assertEqual(self.notas_alumno1[2], self.alumno1.notas[2])
  100.  
  101. def testMetodosCalcula(self):
  102. self.assertEqual(0.6 * ((self.notas_alumno1[0] + self.notas_alumno1[1]) / 2), self.alumno1.calcula_nota_final_parciales())
  103. self.assertEqual(0.4 * self.notas_alumno1[1], self.alumno1.calcula_nota_final_proyecto())
  104.  
  105. def testAlumnoALSToJSON(self):
  106. with io.StringIO() as f:
  107. self.alumno1.to_json(f)
  108. self.assertEqual(TestAlumnoALS.prepara_resultado((self.datos_alumno1)), TestAlumnoALS.prepara_resultado(f.getvalue().strip()))
  109.  
  110. def testAlumnoALSFromJSON(self):
  111. json_a = TestAlumnoALS.prepara_resultado(self.datos_alumno1)
  112.  
  113. with io.StringIO(json_a) as f:
  114. loaded_a = AlumnoALS.from_json(f)
  115.  
  116. self.assertEqual(self.datos_alumno1, loaded_a.__dict__)
  117.  
  118. def testNotaProyecto(self):
  119. self.assertEqual(
  120. str.format("{}: {:5.2f}\n", self.alumno1.nombre, self.alumno1.parcial1),
  121. nota_proyecto(self.alumno1))
  122.  
  123. def testListaAlumnos(self):
  124. listado = lista_alumnos([self.alumno1], nota_proyecto)
  125. self.assertEqual(
  126. str.format("{}: {:5.2f}\n", self.alumno1.nombre, self.alumno1.parcial1),
  127. listado)
  128.  
  129. @staticmethod
  130. def prepara_resultado(s):
  131. return str(s).strip().replace('\'', '"').replace(' ', "")
  132.  
  133.  
  134. if __name__ == "__main__":
  135. unittest.main()
  136.  
Runtime error #stdin #stdout #stderr 0.04s 31984KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
..F....
======================================================================
FAIL: testAlumnoALSToJSON (__main__.TestAlumnoALS)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "./prog.py", line 108, in testAlumnoALSToJSON
AssertionError: '{"_nombre":"Baltasar","_notas":[10,10,10]}' != '{"_notas":[10,10,10],"_nombre":"Baltasar"}'
- {"_nombre":"Baltasar","_notas":[10,10,10]}
+ {"_notas":[10,10,10],"_nombre":"Baltasar"}


----------------------------------------------------------------------
Ran 7 tests in 0.001s

FAILED (failures=1)