毎月、パートナーは親友と会う約束をします。 二人ともスケジュールがとても忙しく、都合のよい日を見つけるのはひと苦労です! 自分も忙しいので、パートナーは会えそうな日をいつも確認してきます。
今月の通話で、パートナーはこんな質問をしてきました。
とまどいながら、『teenth』の日とは何なのかと尋ねます。 パートナーは、『teenth』の日とは自分が考え出した概念で、1か月のうち英語で『-teenth』で終わる日のことだと説明します。
曜日も7つあるので、どの曜日にも毎月_ちょうど1日_ずつ『teenth』の日があることになります。
『teenth』の日の意味がわかったので、カレンダーを確認します。 『teenth』の木曜日には何も予定がないので、うれしくなって、その日にちでいいとパートナーに伝えます。
課題は、月、年、曜日、週が与えられたときに、ミートアップの正確な日付を求めることです。
週の値には、次の6つがあります:first、second、third、fourth、last、teenth。
たとえば、2018年1月の第1月曜日に行われるミートアップの日付を求めることがあります(2018年1月1日)。
同じように、次の日付を求めることもあります:
teenth週とは、1か月のうち、英語で'-teenth'で終わる7日間、つまり13日、14日、15日、16日、17日、18日、19日のことです。
1953年8月のteenth週の土曜日を求めるときは、その月のカレンダーを見てみましょう:
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週の土曜日は1953年8月15日だとわかります。
月の第5曜日がある場合のために、追加の週指定子(fifth)を用意しました。
その月に第5曜日がなければ、例外を送出してください。
コードの中で例外をカスタマイズしたりraiseしたりする必要があることがあります。その際は、エラーの原因が何であるかを示す意味のあるエラーメッセージを必ず含めてください。そうすることでコードが読みやすくなり、デバッグも格段にしやすくなります。
カスタム例外は、新しい例外クラスを作ることで作成できます(詳しくはclassesを参照してください)。こうしたクラスは通常、Exceptionのサブクラスです。
エラーの原因が特定の例外型から派生したものであるとわかっている場合は、_Exception_クラスの下にあるbuilt in error typesのいずれかを継承することもできます。エラーを送出するときも、意味のあるメッセージを含めてください。
この演習では、meetup()関数に無効な曜日名と数の組み合わせが渡されたときに送出("throw")される_カスタム例外_を作成する必要があります。テストが通るのは、適切な例外をカスタマイズしてその例外を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.")