Усі три рівні — про один і той самий файл pohoda.py. Ми більше не пишемо код у зошиті:
кожен рівень закінчується тим, що ти запускаєш скрипт із термінала й дивишся, що він
відповів.
Дані для роботи зроби сам — маленький CSV на 6-8 рядків, щоб підсумок можна було порахувати в голові й звірити:
misto,data,temperatura,opady
Київ,2026-07-01,24.5,0.0
Львів,2026-07-01,21.0,3.2
Київ,2026-07-02,27.1,0.0
...
Працюй у власній теці. Тимчасові файли з практики видалилися самі — тут ти господар.
рівень 1Рівень 1 — База
Напиши pohoda.py, який приймає один позиційний аргумент — шлях до CSV — і друкує
середню температуру. Додай необовʼязковий -m / --misto: якщо його передали, рахуй
лише по рядках цього міста.
Обовʼязково:
- увесь код у функції
main(), яка повертає код виходу; - унизу файлу
if __name__ == "__main__": sys.exit(main()); - результат — у
stdout, повідомлення про помилки — уstderr; - якщо файл не відкрився — повідомлення в
stderrіreturn 1.
Зроблено, якщо: усі чотири команди нижче поводяться саме так, як написано, і ти
перевірив кожну через echo $? (у PowerShell — echo $LASTEXITCODE):
| команда | що має статися |
|---|---|
python3 pohoda.py dani.csv |
середня температура по всіх рядках, код 0 |
python3 pohoda.py dani.csv --misto Київ |
середня лише по Києву, код 0 |
python3 pohoda.py |
повідомлення про брак аргументу, код 2 |
python3 pohoda.py nemaye.csv |
твоє повідомлення в stderr, код 1 |
рівень 2Рівень 2 — Плюс
Доростимо скрипт до утиліти, яку не соромно дати колезі.
- Додай
-d/--dijaзchoices=["serednya", "maksymum", "minimum"]і типовим значеннямserednya. - Додай
-t/--tochnistізtype=intіdefault=1. - Додай прапорець
--tyho(action="store_true"), який прибирає з виводу весь текст — лишається голе число. - У кожен
help=встав%(default)sтам, де є типове значення. - Додай
description=— одне речення про те, що робить скрипт.
Потім не заглядаючи у власний код, запусти python3 pohoda.py -h і прочитай, що
вийшло. Якщо з довідки незрозуміло, як користуватись скриптом, — виправляй тексти
help=, а не додавай пояснення в print.
Зроблено, якщо:
python3 pohoda.py dani.csv -d maksymum -t 0 --tyhoдрукує рівно одне число без жодного слова, і його можна передати далі:python3 pohoda.py dani.csv --tyho | catдає той самий рядок;python3 pohoda.py dani.csv -d mediзавершується кодом2, і в повідомленні видно перелік дозволених значень (ти цього переліку руками не писав);python3 pohoda.py dani.csv > rezultat.txtкладе у файл тільки результат, а службові повідомлення (якщо вони в тебе є) лишаються на екрані;- у виводі
-hє рядок-h, --help, якого ти не додавав.
рівень 3Рівень 3 — Виклик
Три окремі задачі. Кожну можна зробити незалежно.
А. Конвеєр. Навчи скрипт читати зі stdin, коли замість імені файлу передали
одинокий дефіс -. Перевір роботу в справжньому конвеєрі:
cat dani.csv | python3 pohoda.py - --misto Львів
Б. Власна перевірка типу. Напиши функцію nevidjemne_cile(tekst), яка повертає
int, а на відʼємному числі кидає argparse.ArgumentTypeError зі своїм поясненням
українською. Підстав її в type= для --tochnist.
В. Кілька файлів і підкоманди. Або зроби позиційний аргумент nargs="+" і навчи
скрипт рахувати спільний підсумок по кількох файлах, або розбий утиліту на дві
підкоманди через add_subparsers(): pohoda.py temperatura dani.csv і
pohoda.py opady dani.csv, кожна зі своїм набором аргументів.
Зроблено, якщо:
- А:
cat dani.csv | python3 pohoda.py -дає точно той самий рядок, що йpython3 pohoda.py dani.csv, і код виходу в обох випадках0; - Б:
python3 pohoda.py dani.csv --tochnist -1завершується кодом2, а вstderrвидно твоє повідомлення, а не стандартнеinvalid int value; - В: для
nargs="+"— сума по двох файлах дорівнює сумі підсумків по кожному окремо (перевірassert-ом у окремому файлі-тесті); для підкоманд —pohoda.py -hпоказує перелік підкоманд, аpohoda.py opady -hпоказує довідку саме цієї підкоманди.
Підказки
- Не гадай, що вийшло, — питай скрипт:
python3 pohoda.py -hпісля кожної зміни показує актуальний стан справ, бо збирається з того самого опису, що й розбір. - Найшвидший спосіб побачити, що саме приїхало в аргументах, — тимчасово поставити
print(args, file=sys.stderr)одразу післяparse_args(). УNamespaceвидно всі поля разом із підставленими типовими значеннями. - Функція для
type=приймає один рядок і повертає готове значення. Щоб повідомлення вийшло людським, кидай самеargparse.ArgumentTypeError:ValueErrorтеж спрацює, але текст argparse замінить своїм. - Щоб перевірити розділення потоків, не треба нічого рахувати:
python3 pohoda.py dani.csv > /dev/nullмає лишити на екрані тільки службові повідомлення, аpython3 pohoda.py dani.csv 2> /dev/null— тільки результат. - Якщо не хочеться щоразу писати
python3: перший рядок#!/usr/bin/env python3плюсchmod +x pohoda.py— і скрипт запускається як./pohoda.py dani.csv.