Cada mes, tu pareja queda con su mejor amigo. Ambos tienen agendas muy apretadas, ¡así que encontrar una fecha que les venga bien es todo un reto! Como tú también tienes una agenda apretada, tu pareja siempre consulta contigo las posibles fechas para quedar:
En la llamada de este mes, tu pareja te hizo esta pregunta:
Confundido, preguntas qué es un día «teenth». Tu pareja te explica que un día teenth, un concepto que se ha inventado, se refiere a los días del mes que terminan en «-teenth»:
Como además hay siete días de la semana, está garantizado que cada día de la semana tiene exactamente un día teenth cada mes.
Ahora que entiendes el concepto de día teenth, consultas tu calendario. No tienes nada planeado para el jueves teenth, así que confirmas la fecha con tu pareja muy contento.
Tu tarea es encontrar la fecha exacta de una reunión, dados un mes, un año, un día de la semana y una semana.
Hay seis valores posibles para la semana: first, second, third, fourth, last y teenth.
Por ejemplo, es posible que te pidan encontrar la fecha de la reunión del primer lunes de enero de 2018 (1 de enero de 2018).
Del mismo modo, es posible que te pidan encontrar:
La semana «teenth» se refiere a los siete días de un mes que terminan en «-teenth» (13th, 14th, 15th, 16th, 17th, 18th and 19th).
Si nos piden encontrar el sábado «teenth» de agosto de 1953, consultamos su calendario:
August 1953
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
De ahí deducimos que el sábado «teenth» es el 15 de agosto de 1953.
Hemos añadido un descriptor de semana adicional (fifth) para el quinto día de la semana del mes, si lo hay.
Si no hay un quinto día de la semana en un mes, debes lanzar una excepción.
A veces es necesario tanto personalizar como raise excepciones en tu código. Cuando hagas esto, siempre debes incluir un mensaje de error significativo para indicar cuál es el origen del error. Esto hace que tu código sea más legible y ayuda mucho con la depuración.
Las excepciones personalizadas se pueden crear mediante nuevas clases de excepción (consulta classes para más detalles) que normalmente son subclases de Exception.
En situaciones en las que sabes que el origen del error será un derivado de cierto tipo de excepción, puedes optar por heredar de uno de los built in error types bajo la clase Exception. Al lanzar el error, también debes incluir un mensaje significativo.
Este ejercicio en particular requiere que crees una excepción personalizada que sea lanzada/«disparada» cuando a tu función meetup() se le dé una combinación de nombre de día de la semana y número que no sea válida. Las pruebas solo pasarán si personalizas las excepciones adecuadas, las lanzas con raise e incluyes los mensajes de error adecuados.
Para personalizar una built-in exception, crea una class que herede de esa excepción. Al lanzar la excepción personalizada con un mensaje, escribe el mensaje como argumento del tipo exception:
# subclassing the built-in ValueError to create MeetupDayException
class MeetupDayException(ValueError):
"""Exception raised when the Meetup weekday and count do not result in a valid date.
message: explanation of the error.
"""
def __init__(self, message):
self.message = message
# raising a MeetupDayException
raise MeetupDayException("That day does not exist.")
Regístrate en Exercism para aprender y dominar Python con 17 conceptos146 ejercicios y mentoría humana real, todo gratis.