Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/annatsepilova/goit-pycore-hw-07
tasks for learning Python
https://github.com/annatsepilova/goit-pycore-hw-07
python
Last synced: 4 days ago
JSON representation
tasks for learning Python
- Host: GitHub
- URL: https://github.com/annatsepilova/goit-pycore-hw-07
- Owner: AnnaTsepilova
- Created: 2024-07-26T14:05:28.000Z (4 months ago)
- Default Branch: main
- Last Pushed: 2024-07-27T21:27:51.000Z (4 months ago)
- Last Synced: 2024-07-28T19:22:30.481Z (4 months ago)
- Topics: python
- Language: Python
- Homepage:
- Size: 23.4 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# Тема 10. Розширене Об'єктно-Орієнтоване Програмування в Python
## Завдання 1
По перше додамо додатковий функціонал до класів з попередньої домашньої роботи:
Додайте поле `birthday` для дня народження в клас `Record`. Це поле має бути класу `Birthday`. Це поле не обов'язкове, але може бути тільки одне.
```
class Birthday(Field):
def __init__(self, value):
try:
# Додайте перевірку коректності даних
# та перетворіть рядок на об'єкт datetime
except ValueError:
raise ValueError("Invalid date format. Use DD.MM.YYYY")class Record:
def __init__(self, name):
self.name = Name(name)
self.phones = []
self.birthday = None
```- Додайте функціонал роботи з `Birthday` у клас `Record`, а саме функцію `add_birthday`, яка додає день народження до контакту.
- Додайте функціонал перевірки на правильність наведених значень для полів `Phone`, `Birthday`.
- Додайте та адаптуйте до класу `AddressBook` нашу функцію з четвертого домашнього завдання, тиждень 3, `get_upcoming_birthdays`, яка для контактів адресної книги повертає список користувачів, яких потрібно привітати по днях на наступному тижні.Тепер ваш бот повинен працювати саме з функціоналом класу `AddressBook`. Це значить, що замість словника contacts ми використовуємо `book = AddressBook()`
## Завдання 2
Для реалізації нового функціоналу також додайте функції обробники з наступними командами:
- `add-birthday` - додаємо до контакту день народження в форматі `DD.MM.YYYY`
- `show-birthday` - показуємо день народження контакту
- `birthdays` - повертає список користувачів, яких потрібно привітати по днях на наступному тижні```
@input_error
def add_birthday(args, book):
# реалізація@input_error
def show_birthday(args, book):
# реалізація@input_error
def birthdays(args, book):
# реалізація
```Тож в фіналі наш бот повинен підтримувати наступний список команд:
1. **add** **[ім'я]** **[телефон]**: Додати або новий контакт з іменем та телефонним номером, або телефонний номер к контакту який вже існує.
2. **hange** **[ім'я]** **[старий телефон]** **[новий телефон]**: Змінити телефонний номер для вказаного контакту.
3. **phone** **[ім'я]**: Показати телефонні номери для вказаного контакту.
4. **all**: Показати всі контакти в адресній книзі.
5. **add-birthday** **[ім'я]** **[дата народження]**: Додати дату народження для вказаного контакту.
6. **show-birthday** **[ім'я]**: Показати дату народження для вказаного контакту.
7. **birthdays**: Показати дні народження, які відбудуться протягом наступного тижня.
8. **hello**: Отримати вітання від бота.
9. **close** або **exit**: Закрити програму.```
def main():
book = AddressBook()
print("Welcome to the assistant bot!")
while True:
user_input = input("Enter a command: ")
command, *args = parse_input(user_input)if command in ["close", "exit"]:
print("Good bye!")
breakelif command == "hello":
print("How can I help you?")elif command == "add":
# реалізаціяelif command == "change":
# реалізаціяelif command == "phone":
# реалізаціяelif command == "all":
# реалізаціяelif command == "add-birthday":
# реалізаціяelif command == "show-birthday":
# реалізаціяelif command == "birthdays":
# реалізаціяelse:
print("Invalid command.")```
Для прикладу розглянемо реалізацію команди `add [ім'я] [телефон]`. В функції `main` ми повинні додати обробку цієї команди, в відповідне місце:
```
elif command == "add":
print(add_contact(args, book))
```Сама реалізація функції `add_contact` може виглядати наступним чином:
```
@input_error
def add_contact(args, book: AddressBook):
name, phone, *_ = args
record = book.find(name)
message = "Contact updated."
if record is None:
record = Record(name)
book.add_record(record)
message = "Contact added."
if phone:
record.add_phone(phone)
return message```
Наша функція `add_contact` має два призначення - додавання нового контакту або оновлення телефону для контакту, що вже існує в адресній книзі.
Параметри функції це список аргументів `args` та сама адресна книга `book`.
Спочатку функція розпаковує список `args`, отримуючи ім'я `name` і телефон `phone` з перших двох елементів списку. Решта аргументів ігнорується завдяки використанню. Далі метод `find` об'єкта `book` виконує пошук запису з іменем `name`. Якщо запис з таким іменем існує, метод повертає цей запис, інакше повертається `None`.
Якщо запис не знайдено, то це новий контакт і функція створює новий об'єкт `Record` з іменем `name` і додає його до `book` викликом методу `add_record`. Після додавання нового запису змінній `message` присвоюється повідомлення `"Contact added."` успішності операції.
Далі незалежно від того, чи був запис знайдений або створений новий, до цього запису додається телефонний номер за допомогою методу `add_phone`, якщо він був наданий. На завершення функція повертає повідомлення про результат своєї роботи: `"Contact updated."`, якщо контакт був оновлений, або `"Contact added."`, якщо контакт був доданий. Для перехоплення помилок вводу та виведення відповідного повідомлення про помилку використовуємо декоратор `@input_error`.