Це перше завдання, у якому ти працюєш не в одному файлі. Заведи для нього окрему теку —
хай буде dz16/ — і всі файли складай у неї. Термінал відкривай саме в цій теці:
шлях пошуку модулів починається з неї.
рівень 1Рівень 1 — База
Розклади маленьку програму на два файли.
- Створи модуль
perevodyach.pyз константоюKURS = 41.5і двома функціями:v_hryvni(usd)іv_dolary(uah). Обидві округлюють результат до копійок. - Створи
main.py, який імпортує модуль трьома різними формами (у трьох окремих рядках із коментарем, яка це форма) і друкує результат кожної. - Додай у
main.pyперевіркуassert, що переведення туди й назад повертає початкове число з точністю до копійки. - Запусти:
python3 main.py. Подивись, чи з'явилася тека__pycache__, і поясни у коментарі, для якого саме з двох файлів вона зроблена.
Зроблено, якщо: python3 main.py відпрацьовує без помилок, друкує три результати
й повідомлення про пройдений assert, а в коментарі написано, чому в __pycache__
лежить perevodyach, а не main.
рівень 2Рівень 2 — Плюс
Навчи модуль поводитися по-різному в двох ролях.
- Додай у кінець
perevodyach.pyблокif __name__ == "__main__":з короткою демонстрацією: переведи 100 доларів і надрукуй результат. - Перевір обидва сценарії й запиши спостереження у файл
sposterezhennya.md: python3 perevodyach.py— що надрукувалось;python3 main.py— чи з'явилась демонстрація;- додай на верхній рівень
perevodyach.pyрядокprint("модуль завантажено")поза захисною умовою й повтори обидва запуски. - Поясни своїми словами, чому третій пункт — це саме та проблема, яку розв'язує захисна умова.
Зроблено, якщо: у sposterezhennya.md є чотири блоки виводу (два сценарії × до і після
додавання рядка) і абзац пояснення, у якому названо значення __name__ в обох випадках.
рівень 3Рівень 3 — Виклик
Збери пакет і власноруч зламай його циклічним імпортом.
- Перетвори свій код на пакет:
dz16/
├── main.py
└── finansy/
├── __init__.py
├── kursy.py # KURS і функції переведення
└── zvity.py # форматування звіту
- Зроби в
finansy/__init__.pyфасад: перетягни тудиv_hryvni, щоб ізmain.pyпрацювалоfrom finansy import v_hryvni— без згадки проkursy. - Тепер навмисно створи цикл: хай
kursy.pyна верхньому рівні імпортуєzvityі використовує його константу, аzvity.py— імпортуєkursyй використовуєKURS. Запусти й збережи traceback уcykl.md. - Виправ цикл двома різними способами й заміряй, чим вони відрізняються:
- винести спільну константу в третій модуль
spilne.py; - перенести один із імпортів усередину функції.
- У
cykl.mdнапиши, який спосіб ти лишиш у коді й чому. Наведи щонайменше два аргументи на користь свого вибору.
Зроблено, якщо: у cykl.md є (а) traceback зі словами partially initialized module,
(б) код обох виправлень, (в) абзац із двома аргументами; при цьому python3 main.py
відпрацьовує без помилок у фінальній версії, а from finansy import v_hryvni працює.
Підказки
- Не вгадуй, звідки взявся модуль — надрукуй
модуль.__file__. Один рядок економить пів години, коли «імпортується щось не те». - Порядок у циклі має значення. Перш ніж дивитись на traceback, спробуй передбачити
на папері, у якому порядку виконаються тіла модулів. Ключ до відповіді — момент, коли
запис з'являється в
sys.modules. - Фасад в
__init__.py— це звичайний імпорт, записаний у файлі пакета. Подумай, який саме рядок туди покласти, щоб ім'я стало доступним якfinansy.v_hryvni. - Якщо
python3 main.pyкажеModuleNotFoundError: No module named 'finansy'— ти стоїш не в тій теці. Зробиpwdіls:finansy/має бути видно поруч ізmain.py. - Тека
__pycache__у домашню роботу не здається — це похідні файли. Якщо здаєш через git, додай її в.gitignore.