每個月,你的伴侶都會和他們最好的朋友見面。 他們兩個人的行程都非常忙,要找到適合的日期可說是一大挑戰! 由於你自己的行程也很忙,你的伴侶總是會先和你確認可能的見面日期:
在這個月的通話中,你的伴侶問了你這個問題:
你一頭霧水,問什麼是「teenth」日。 你的伴侶解釋說,他們自創了一個叫 teenth day 的概念,指的是每個月裡以「-teenth」結尾的那些日子:
由於一週也有七天,因此可以保證每個星期幾在每個月都恰好會有一個 teenth day。
現在你懂了 teenth day 的概念,便去查看自己的行事曆。 你在那個 teenth 星期四沒有任何安排,於是開心地和伴侶確認了這個日期。
你的任務是:給定月份、年份、星期幾與週次,找出聚會的確切日期。
需要考慮的週次值有六個:first、second、third、fourth、last、teenth。
舉例來說,你可能會被要求找出 2018 年 1 月第一個星期一的聚會日期(2018 年 1 月 1 日)。
同樣地,你也可能被要求找出:
teenth 這個週次指的是每個月裡以「-teenth」結尾的那七天(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 日。
我們額外新增了一個星期描述詞(fifth),用來表示一個月中的第五個星期幾,如果有的話。
如果一個月中沒有第五個星期幾,你應該拋出一個例外。
有時候,你會需要在程式碼中同時自訂和raise例外。這麼做的時候,一定要加上有意義的錯誤訊息,指出錯誤的來源。這能讓你的程式碼更好讀,也對除錯很有幫助。
自訂例外可以透過新的例外類別來建立(詳情請見 classes),這些類別通常是 Exception 的子類別。
如果你知道錯誤來源會是某種例外型別的衍生,可以選擇繼承 Exception 類別底下的其中一個 built in error types。拋出錯誤時,仍然要附上有意義的訊息。
這個練習要求你建立一個_自訂例外_,在你的 meetup() 函式收到無效的星期名稱與數字組合時拋出這個例外。只有當你自訂了適當的例外、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.")