Κάθε μήνα, ο σύντροφός σου συναντιέται με τον καλύτερό του φίλο. Και οι δύο έχουν πολύ φορτωμένο πρόγραμμα, κι έτσι είναι δύσκολο να βρουν μια κατάλληλη ημερομηνία! Επειδή κι εσύ έχεις φορτωμένο πρόγραμμα, ο σύντροφός σου τσεκάρει πάντα μαζί σου τις πιθανές ημερομηνίες για τη συνάντηση:
Στην κλήση αυτού του μήνα, ο σύντροφός σου σου έκανε αυτή την ερώτηση:
Μπερδεμένος, ρωτάς τι είναι μια ημέρα "teenth". Ο σύντροφός σου εξηγεί ότι μια ημέρα teenth, μια έννοια που επινόησε ο ίδιος, αναφέρεται στις ημέρες του μήνα που τελειώνουν σε '-teenth':
Καθώς υπάρχουν επίσης επτά ημέρες της εβδομάδας, είναι εγγυημένο ότι κάθε ημέρα της εβδομάδας έχει ακριβώς μία ημέρα teenth κάθε μήνα.
Τώρα που κατάλαβες την έννοια της ημέρας teenth, κοιτάς το ημερολόγιό σου. Δεν έχεις τίποτα προγραμματισμένο την teenth Πέμπτη, οπότε επιβεβαιώνεις με χαρά την ημερομηνία με τον σύντροφό σου.
Το καθήκον σου είναι να βρεις την ακριβή ημερομηνία μιας συνάντησης, όταν σου δίνονται ένας μήνας, ένα έτος, μια ημέρα της εβδομάδας και μια εβδομάδα.
Υπάρχουν έξι τιμές εβδομάδας που πρέπει να λάβεις υπόψη: first, second, third, fourth, last, teenth.
Για παράδειγμα, μπορεί να σου ζητηθεί να βρεις την ημερομηνία της συνάντησης την πρώτη Δευτέρα του Ιανουαρίου 2018 (1 Ιανουαρίου 2018).
Παρομοίως, μπορεί να σου ζητηθεί να βρεις:
Η εβδομάδα teenth αναφέρεται στις επτά ημέρες ενός μήνα που καταλήγουν σε '-teenth' (13th, 14th, 15th, 16th, 17th, 18th και 19th).
Αν σου ζητηθεί να βρεις το teenth Σάββατο του Αυγούστου 1953, κοιτάμε το ημερολόγιό του:
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
Από αυτό βρίσκουμε ότι το teenth Σάββατο είναι η 15η Αυγούστου 1953.
Έχουμε προσθέσει έναν επιπλέον περιγραφέα εβδομάδας (fifth) για την πέμπτη ημέρα της εβδομάδας του μήνα, αν υπάρχει.
Αν δεν υπάρχει πέμπτη τέτοια ημέρα σε έναν μήνα, θα πρέπει να πετάξεις μια εξαίρεση.
Μερικές φορές είναι απαραίτητο και να προσαρμόσεις και να κάνεις raise εξαιρέσεις στον κώδικά σου. Όταν το κάνεις αυτό, θα πρέπει πάντα να συμπεριλαμβάνεις ένα ουσιαστικό μήνυμα σφάλματος που να δείχνει ποια είναι η πηγή του σφάλματος. Αυτό κάνει τον κώδικά σου πιο ευανάγνωστο και βοηθάει σημαντικά στην αποσφαλμάτωση.
Οι προσαρμοσμένες εξαιρέσεις μπορούν να δημιουργηθούν μέσω νέων κλάσεων εξαιρέσεων (δες το classes για περισσότερες λεπτομέρειες.) που συνήθως είναι υποκλάσεις της Exception.
Σε περιπτώσεις όπου ξέρεις ότι η πηγή του σφάλματος θα είναι παράγωγο κάποιου συγκεκριμένου τύπου εξαίρεσης, μπορείς να επιλέξεις να κληρονομήσεις από έναν από τους built in error types κάτω από την κλάση Exception. Όταν πετάς το σφάλμα, θα πρέπει και πάλι να συμπεριλαμβάνεις ένα ουσιαστικό μήνυμα.
Αυτή η συγκεκριμένη άσκηση απαιτεί να δημιουργήσεις μια προσαρμοσμένη εξαίρεση που θα πετιέται/"ρίχνεται" όταν στη συνάρτηση meetup() δίνεται ένας μη έγκυρος συνδυασμός ονόματος ημέρας της εβδομάδας και αριθμού. Τα tests θα περάσουν μόνο αν προσαρμόσεις τις κατάλληλες εξαιρέσεις, κάνεις raise αυτές τις εξαιρέσεις και συμπεριλάβεις τα κατάλληλα μηνύματα σφάλματος.
Για να προσαρμόσεις μια built-in exception, δημιούργησε μια class που κληρονομεί από αυτή την εξαίρεση. Όταν πετάς την προσαρμοσμένη εξαίρεση με ένα μήνυμα, γράψε το μήνυμα ως όρισμα στον τύπο 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.")
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Python με 17 έννοιες146 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.