トラック
/
Python
Python
/
演習
/
ミートアップ
ミートアップ

ミートアップ

中級

はじめに

毎月、パートナーは親友と会う約束をします。 二人ともスケジュールがとても忙しく、都合のよい日を見つけるのはひと苦労です! 自分も忙しいので、パートナーは会えそうな日をいつも確認してきます。

  • 「来月の第1金曜日なら会える?」
  • 「第3水曜日はどう?」
  • 「最後の日曜日は?」

今月の通話で、パートナーはこんな質問をしてきました。

  • 「『teenth』の木曜日に会いたいんだけど、いいかな?」

とまどいながら、『teenth』の日とは何なのかと尋ねます。 パートナーは、『teenth』の日とは自分が考え出した概念で、1か月のうち英語で『-teenth』で終わる日のことだと説明します。

  • 13th (thirteenth)
  • 14th (fourteenth)
  • 15th (fifteenth)
  • 16th (sixteenth)
  • 17th (seventeenth)
  • 18th (eighteenth)
  • 19th (nineteenth)

曜日も7つあるので、どの曜日にも毎月_ちょうど1日_ずつ『teenth』の日があることになります。

『teenth』の日の意味がわかったので、カレンダーを確認します。 『teenth』の木曜日には何も予定がないので、うれしくなって、その日にちでいいとパートナーに伝えます。

説明

課題は、月、年、曜日、週が与えられたときに、ミートアップの正確な日付を求めることです。

週の値には、次の6つがあります:first、second、third、fourth、last、teenth。

たとえば、2018年1月の第1月曜日に行われるミートアップの日付を求めることがあります(2018年1月1日)。

同じように、次の日付を求めることもあります:

  • 2019年8月の第3火曜日(2019年8月20日)
  • 2020年5月のteenth週の水曜日(2020年5月13日)
  • 2021年7月の第4日曜日(2021年7月25日)
  • 2022年11月の最後の木曜日(2022年11月24日)
  • 1953年8月のteenth週の土曜日(1953年8月15日)

Teenth

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日だとわかります。

Pythonでのこの演習の構成

月の第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.")

出典

Jeremy Hinegardnerが、毎月Wednesteenthに開かれるBoulderのミートアップについて言及したのがきっかけです。
GitHubで編集する リンクは新しいウィンドウまたはタブで開きます
Python Exercism

ミートアップを始める準備はできましたか?

Exercismに登録すれば、17個のコンセプト146個の演習、そして本物の人間によるメンタリングとともに、Pythonを学んでマスターできます。すべて無料です。