هر ماه، همسرتان با بهترین دوستش ملاقات میکند. هر دوی آنها برنامههای بسیار پرمشغلهای دارند و همین پیدا کردن یک تاریخ مناسب را دشوار میکند! با توجه به برنامهی پرمشغلهی خودتان، همسرتان همیشه تاریخهای احتمالی ملاقات را با شما دوباره بررسی میکند:
در تماس این ماه، همسرتان این سؤال را از شما پرسید:
گیج میشوید و میپرسید روز «teenth» چیست. همسرتان توضیح میدهد که روز teenth، مفهومی که خودش از خودش درآورده است، به روزهایی از ماه اشاره دارد که به «-teenth» ختم میشوند:
از آنجا که هفت روز هفته هم وجود دارد، تضمین میشود که هر روز هفته در هر ماه دقیقاً یک روز teenth دارد.
حالا که مفهوم روز teenth را میفهمید، تقویمتان را نگاه میکنید. برای پنجشنبهی teenth هیچ برنامهای ندارید، پس با خوشحالی تاریخ را با همسرتان تأیید میکنید.
وظیفهی شما این است که با داشتن ماه، سال، روز هفته و هفته، تاریخ دقیق یک دورهمی را پیدا کنید.
شش مقدار برای هفته وجود دارد که باید در نظر بگیرید: first، second، third، fourth، last، teenth.
برای مثال، ممکن است از شما خواسته شود تاریخ دورهمی در اولین دوشنبهی ژانویه ۲۰۱۸ (۱ ژانویه ۲۰۱۸) را پیدا کنید.
به همین ترتیب، ممکن است از شما خواسته شود که موارد زیر را پیدا کنید:
هفتهی teenth به هفت روز در ماه اشاره دارد که به «-teenth» ختم میشوند (روزهای ۱۳، ۱۴، ۱۵، ۱۶، ۱۷، ۱۸ و ۱۹).
اگر از ما خواسته شود شنبهی 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، ۱۵ اوت ۱۹۵۳ است.
ما یک توصیفگر هفتهی دیگر (fifth) هم اضافه کردهایم که به پنجمین روز هفته در ماه اشاره میکند، به شرط آنکه وجود داشته باشد.
اگر پنجمین روز هفته در یک ماه وجود نداشته باشد، باید یک «استثنا» پرتاب کنید.
گاهی لازم است در code خودتان، استثناها را هم سفارشیسازی کنید و هم raise کنید. وقتی این کار را میکنید، همیشه باید یک پیام خطای معنادار را بگنجانید تا نشان دهد منبع خطا چیست. این کار code شما را خواناتر میکند و کمک چشمگیری به debug میکند.
استثناهای سفارشی را میتوان از طریق کلاسهای استثنای تازه ساخت (برای جزئیات بیشتر classes را ببینید.) که معمولاً زیرکلاسهای Exception هستند.
در موقعیتهایی که میدانید منبع خطا مشتقشده از یک نوع استثنای خاص خواهد بود، میتوانید انتخاب کنید که از یکی از built in error types زیر کلاس Exception ارثبری کنید. هنگام پرتاب خطا هم همچنان باید یک پیام معنادار را بگنجانید.
این تمرین خاص میخواهد که شما یک استثنای سفارشی بسازید تا وقتی تابع meetup() شما ترکیب نامعتبری از اسم روز هفته و شماره دریافت میکند، پرتاب/«thrown» شود. تستها تنها در صورتی پاس میشوند که استثناهای مناسب را سفارشیسازی کنید، آن استثناها را 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.")