fork download
  1. # ALS Parcial 2b 2018/19 MIT License Baltasar <jbgarcia@uvigo.es>
  2.  
  3.  
  4. """
  5. 1. La clase Contacto guarda los datos: nombre, apellidos, tlf (teléfono), y email, utilizando propiedades para acceder a la información. Los métodos de la clase serán: __init__(), __str_() (que devuelve los datos en formato <apellidos>, <nombre> (<tlf>): <email>), y __getattr__(). El acceso a nombre_completo (que devuelve el nombre en el formato <apellidos>, <nombre>) se hará mediante __getattr__(), no existiendo otra propiedad, atributo o método que lo haga.
  6.  
  7. c1 = Contacto(“Baltasar”, “Garcia”, 988368891, “jbgarcia@uvigo.es”)
  8. print(c1.nombre) # Baltasar
  9. print(c1.nombre_completo) # García, Baltasar
  10.  
  11.  
  12. 2. Cree los métodos to_csv(f) y from_csv(f). El primero escribe la codificación CSV del objeto como un archivo, la segunda toma un archivo con contenido en formato CSV y crea un objeto con dicho contenido. Será necesario crear un lector r (csv.reader) sobre el archivo f y leer la fila CSV con next(r), mientras que para guardar datos se creará un escritor w (csv.writer) y se guardará la información con w.writerow(l). El orden de guardado de los atributos será el mismo que el utilizado para la construcción de los objetos Contacto.
  13.  
  14. c1 = Contacto(“Baltasar”, “Garcia”, 988368891, “jbgarcia@uvigo.es”)
  15.  
  16. with open(“datos.csv”, “wt”) as f:
  17. c1.to_csv(f)
  18.  
  19. with open(“datos.csv”, “rt”) as f:
  20. print(str(Contacto.from_csv(f))) # García, Baltasar (988368891): ...
  21.  
  22.  
  23. 3. Escriba la función lista_contactos(lc, f), que recibe como parámetros una lista de registros y una función que define cómo combinar dos contactos. Deben utilizarse exclusivamente lambdas, y para esta función en particular, reducir la lista.
  24.  
  25. listado = lista_contactos([c1, c2, c3], lambda c1, c2: str(c1) + “\n” + str(c2))
  26. print(listado) # Baltasar…
  27.  
  28. """
  29.  
  30.  
  31. import csv
  32.  
  33. class Contacto:
  34. def __init__(self, nombre, apellidos, tlf, email):
  35. self._nombre = nombre
  36. self._apellidos = apellidos
  37. self._tlf = tlf
  38. self._email = email
  39.  
  40. @property
  41. def nombre(self):
  42. return self._nombre
  43.  
  44. @property
  45. def apellidos(self):
  46. return self._apellidos
  47.  
  48. @property
  49. def tlf(self):
  50. return self._tlf
  51.  
  52. @property
  53. def email(self):
  54. return self._email
  55.  
  56. @staticmethod
  57. def from_csv(f):
  58. reader = csv.reader(f)
  59. data = next(reader)
  60. toret = Contacto(data[0], data[1], int(data[2]), data[3])
  61. return toret
  62.  
  63. def to_csv(self, f):
  64. writer = csv.writer(f)
  65. writer.writerow([self.nombre, self.apellidos, self.tlf, self.email])
  66.  
  67. def __getattr__(self, s):
  68. if s == "nombre_completo":
  69. return self.apellidos + ", " + self.nombre
  70. else:
  71. raise AttributeError(s)
  72.  
  73. def __str__(self):
  74. return str.format("{} ({}): {}", self.nombre_completo, self.tlf, self.email)
  75.  
  76.  
  77. lista_contactos = lambda l, f:(
  78. "" if not l or l == []
  79. else f(l[0], lista_contactos(l[1:], f)))
  80.  
  81.  
  82. import unittest
  83. import io
  84.  
  85.  
  86. class TestContacto(unittest.TestCase):
  87. def setUp(self):
  88. self.c1 = Contacto("Baltasar", "García", 988368891, "jbgarcia@uvigo.es")
  89. self.todos_contactos = [self.c1]
  90. self.todos_resultados = [
  91. "García, Baltasar (988368891): jbgarcia@uvigo.es",
  92. ]
  93.  
  94. def testContactoStr(self):
  95. self.assertEqual(len(self.todos_resultados), len(self.todos_contactos))
  96. for i, resultado in enumerate(self.todos_resultados):
  97. resultado_contacto = TestContacto.prepara_resultado(str(self.todos_contactos[i]))
  98. resultado = TestContacto.prepara_resultado(resultado)
  99. self.assertEqual(resultado, resultado_contacto)
  100.  
  101. def testContactoNombreCompleto(self):
  102. for c in self.todos_contactos:
  103. nombre_completo = c.apellidos + ", " + c.nombre
  104. self.assertEqual( nombre_completo, c.nombre_completo)
  105.  
  106. def testContactoCSV(self):
  107. for c in self.todos_contactos:
  108. with io.StringIO() as s:
  109. c.to_csv(s)
  110. self.assertEqual(",".join([c.nombre, c.apellidos, str(c.tlf), c.email]), s.getvalue().strip())
  111.  
  112. def testLoadFromCSV(self):
  113. for i, c1 in enumerate(self.todos_contactos):
  114. with io.StringIO(",".join([c1.nombre, c1.apellidos, str(c1.tlf), c1.email])) as f:
  115. c2 = Contacto.from_csv(f)
  116. self.assertEqual(c1.nombre, c2.nombre)
  117. self.assertEqual(c1.apellidos, c2.apellidos)
  118. self.assertEqual(c1.tlf, c2.tlf)
  119. self.assertEqual(c1.email, c2.email)
  120.  
  121. def testListaRegistros(self):
  122. resultado = lista_contactos(self.todos_contactos, lambda x, y: str(x) + "\n" + str(y)).strip()
  123. todos_resultados = "\n".join([str(c) for c in self.todos_contactos])
  124. self.assertEqual(todos_resultados, resultado)
  125.  
  126. @staticmethod
  127. def prepara_resultado(s):
  128. return s.strip().replace('\'', '"').replace(' ', "")
  129.  
  130.  
  131. if __name__ == "__main__":
  132. unittest.main()
  133.  
Success #stdin #stdout #stderr 0.04s 32104KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
.....
----------------------------------------------------------------------
Ran 5 tests in 0.000s

OK