Интересный вопрос, и вот полное решение. Я начну с определения своей функции, я поместил это в файл с именем payday.py
:
def nexypayday(fromdate=None):
"""
@param fromdate: An instance of datetime.date that is the day to go from. If
not specified, todays date is used.
@return: The first payday on or after the date specified.
"""
Далее нам нужны тесты. Это должно четко определить поведение нашего метода. Поскольку вы новичок в Python, я собираюсь изо всех сил и привести вам пример использования юнит-тестов.
from unittest import TestCase, main
import payday
import datetime
class TestPayday(TestCase):
def test_first_jan(self):
self.assertEqual(payday.nextpayday(datetime.date(2010, 1, 1)),
datetime.date(2010, 1, 1))
def test_second_jan(self):
self.assertEqual(payday.nextpayday(datetime.date(2010, 1, 2)),
datetime.date(2010, 1, 15))
def test_fifteenth_jan(self):
self.assertEqual(payday.nextpayday(datetime.date(2010, 1, 15)),
datetime.date(2010, 1, 15))
def test_thirty_one_jan(self):
self.assertEqual(payday.nextpayday(datetime.date(2010, 1, 31)),
datetime.date(2010, 2, 1))
def test_today(self):
self.assertTrue(payday.nextpayday() >= datetime.date.today())
if __name__ == '__main__':
main()
Это работающий модуль Python. Вы можете пойти дальше и назвать это test_payday.py
и запустить его с python test_payday.py
. Это должно немедленно завершиться ошибкой с различными сообщениями об ошибках, потому что мы еще не написали правильный код.
После некоторого изучения того, как работает datetime.date, я решил: mydatetime.day
- это день месяца, mydatetime + datetime.timedelta(days=1)
создаст новый datetime
один день в году. Таким образом, я могу бросить это в payday.py
.
import datetime
def nextpayday(fromdate=None):
"""
@param fromdate: An instance of datetime.date that is the day to go from. If
not specified, todays date is used.
@return: The first payday on or after the date specified.
"""
if fromdate is None:
fromdate = datetime.date.today()
# while the day of the month isn't 1 or 15, increase the day by 1
while fromdate.day not in (1, 15):
fromdate = fromdate + datetime.timedelta(days=1)
return fromdate
Запустите юнит-тесты, и все должно быть золотым. Обратите внимание, что в моих тестах я сделал так, что если я проверяю, какой «следующий» день выплаты у зарплаты, он возвращает свой собственный день. Изменение этого слова на возвращение «следующего» дня зарплаты оставлено читателю в качестве упражнения.