fork download
  1. # ALS Parcial 2a 2018/19 MIT License Baltasar <jbgarcia@uvigo.es>
  2.  
  3.  
  4. import json
  5.  
  6.  
  7. """
  8. 1. La clase Registro es capaz de albergar varios datos que pueden ser accedidos por nombre, por nombre construido (r#i), o por índice. Para construir un objeto, se le puede pasar o bien un diccionario, o bien una lista (en este caso, las claves serán las citadas r#i). Los únicos métodos en la clase son: __init__(), __getattr__(), __len__() (que devuelve el número de elementos), y __str__() (que devuelve el contenido del objeto en formato de diccionario, utilizando comillas dobles y un espacio tras ‘,’ y ‘:’).
  9.  
  10. r1 = Registro({"huevos": 15, "patatas": 5})
  11. print(r1.r0, r1.get(0), r1.huevos) # 15 15 15
  12. print(r1.r1, r1.get(1), r1.patatas) # 5 5 5
  13. print(r1) # {“huevos”: 15, “patatas”: 5}
  14.  
  15. r2 = Registro([“a”, “b”])
  16. print(r2.r0, r2.get(0)) # a a
  17. print(r2.r1, r2.get(1)) # b b
  18. print(r2) # {“r0”: “a”, “r1”: “b”}
  19.  
  20.  
  21. 2. 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.
  22.  
  23. r2 = Registro([“a”, “b”, “c”])
  24.  
  25. with open(“datos.json”, “wt”) as f:
  26. r2.to_json(f) # {“r0”: “a”, “r1”: “b”, “r2”: “c”}
  27.  
  28. with open(“datos.json”, “rt”) as f:
  29. print(str(Registro.from_json(f))) # {“r0”: “a”, “r1”: “b”, “r2”: “c”}
  30.  
  31.  
  32. 3. Escriba la función filtra_registros(lr, f), que recibe como parámetros una lista de registros y una función que devolverá verdadero o falso según el registro que se le pase. Deben utilizarse exclusivamente lambdas, y para esta función en particular, filtrar la lista.
  33.  
  34. resultado = filtra_registros([r1, r2], lambda r: isinstance(r.r0, int))
  35. print(resultado) # [r1]
  36.  
  37. """
  38.  
  39.  
  40. class Registro:
  41. def __init__(self, datos):
  42. if isinstance(datos, dict):
  43. self.__dict__ = datos
  44. elif (isinstance(datos, list)
  45. or isinstance(datos, tuple)
  46. or isinstance(datos, set)):
  47. for i, x in enumerate(list(datos)):
  48. self.__dict__['r' + str(i)] = x
  49. else:
  50. self.__dict__["r0"] = datos
  51.  
  52. def __getattr__(self, s):
  53. def getPos(i):
  54. return self.__dict__[list(self.__dict__.keys())[i]]
  55.  
  56. toret = None
  57.  
  58. if s.startswith('r'):
  59. try:
  60. toret = getPos(int(s[1:]))
  61. except (KeyError, ValueError):
  62. toret = None
  63. elif s.startswith('get'):
  64. toret = lambda i: getPos(i)
  65.  
  66. return toret
  67.  
  68. def to_json(self, f):
  69. return json.dump(self.__dict__, f)
  70.  
  71. @staticmethod
  72. def from_json(f):
  73. toret = Registro({})
  74. toret.__dict__ = json.load(f)
  75. return toret
  76.  
  77. def __len__(self):
  78. return len(self.__dict__)
  79.  
  80. def __str__(self):
  81. toret = "{"
  82. separador = ""
  83. for key in self.__dict__.keys():
  84. value = self.__dict__[key]
  85.  
  86. if isinstance(value, str):
  87. value = "\"" + value + "\""
  88. else:
  89. value = str(value)
  90.  
  91. toret += separador
  92. toret += "\"" + key + "\": "
  93. toret += value
  94. separador = ", "
  95. return toret + '}'
  96.  
  97.  
  98. filtra_registros = lambda lr, f: ([] if lr == []
  99. else [lr[0]] + filtra_registros(lr[1:], f)
  100. if f(lr[0])
  101. else filtra_registros(lr[1:], f))
  102.  
  103.  
  104. import io
  105. import unittest
  106.  
  107.  
  108. class TestRegistro(unittest.TestCase):
  109. def setUp(self):
  110. self.r1 = Registro({"huevos": 15, "patatas": 5, "salchichas": 12})
  111. self.r2 = Registro([1, 2, 3, 4, 5])
  112. self.r3 = Registro('a')
  113. self.todos_registros = [self.r1, self.r2, self.r3]
  114. self.todos_resultados = [
  115. "{\"huevos\":15,\"patatas\":5,\"salchichas\":12}",
  116. "{\"r0\":1,\"r1\":2,\"r2\":3,\"r3\":4,\"r4\":5}",
  117. "{\"r0\":\"a\"}"
  118. ]
  119.  
  120. def testRegistroPorIndiceGet(self):
  121. r1 = [15, 5, 12]
  122. r2 = [1, 2, 3, 4, 5]
  123. r3 = ['a']
  124. todos_resultados = [r1, r2, r3]
  125.  
  126. self.assertEqual(len(todos_resultados), len(self.todos_registros))
  127. for i, l in enumerate(todos_resultados):
  128. r = self.todos_registros[i]
  129. self.assertEqual(len(l), len(r))
  130. for n, x in enumerate(l):
  131. self.assertEqual(x, r.get(n))
  132. self.assertEqual(x, getattr(r, "r" + str(n)))
  133.  
  134. def testRegistroStr(self):
  135. self.assertEqual(len(self.todos_resultados), len(self.todos_registros))
  136. for i, resultado in enumerate(self.todos_resultados):
  137. resultado_registro = TestRegistro.prepara_resultado(str(self.todos_registros[i]))
  138. resultado = TestRegistro.prepara_resultado(resultado)
  139. self.assertEqual(resultado, resultado_registro)
  140.  
  141. def testRegistroR1PorNombre(self):
  142. self.assertEqual(15, self.r1.huevos)
  143. self.assertEqual(5, self.r1.patatas)
  144. self.assertEqual(12, self.r1.salchichas)
  145.  
  146. def testRegistroToJSON(self):
  147. for r in self.todos_registros:
  148. with io.StringIO() as f:
  149. r.to_json(f)
  150. self.assertEqual(str(r), f.getvalue().strip())
  151.  
  152. def tesRegistroFromJSON(self):
  153. for i, r in enumerate(self.todos_registros):
  154. json_r = TestRegistro.prepara_resultado(str(r))
  155.  
  156. with io.StringIO(self.todos_resultados[i]) as f:
  157. loaded_r = Registro.from_json(f)
  158.  
  159. resultado = TestRegistro.prepara_resultado(str(loaded_r))
  160. self.assertEqual(resultado, json_r)
  161.  
  162. def testFiltraRegistros(self):
  163. resultado = filtra_registros(self.todos_registros, lambda r: isinstance(r.r0, int))
  164. self.assertEqual([self.r1, self.r2], resultado)
  165.  
  166. @staticmethod
  167. def prepara_resultado(s):
  168. return s.strip().replace('\'', '"').replace(' ', "")
  169.  
  170.  
  171. if __name__ == "__main__":
  172. unittest.main()
  173.  
Runtime error #stdin #stdout #stderr 0.05s 32008KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
.F.F.
======================================================================
FAIL: testRegistroPorIndiceGet (__main__.TestRegistro)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "./prog.py", line 131, in testRegistroPorIndiceGet
AssertionError: 5 != 12

======================================================================
FAIL: testRegistroStr (__main__.TestRegistro)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "./prog.py", line 139, in testRegistroStr
AssertionError: '{"huevos":15,"patatas":5,"salchichas":12}' != '{"huevos":15,"salchichas":12,"patatas":5}'
- {"huevos":15,"patatas":5,"salchichas":12}
+ {"huevos":15,"salchichas":12,"patatas":5}


----------------------------------------------------------------------
Ran 5 tests in 0.001s

FAILED (failures=2)