Тест самоперевірки

Скрипти командного рядка

Обери відповідь — і одразу побачиш пояснення. Помилитись тут корисніше, ніж на іспиті.

← до лекції
Відповіді0 / 8   правильних: 0
Питання 1 / 8

Скрипт запустили командою: python3 zvit.py prodazhi.csv --dia serednye. Чому дорівнює len(sys.argv)?

Чому так. У sys.argv лягають чотири рядки: ʼzvit.pyʼ, ʼprodazhi.csvʼ, ʼ--diaʼ, ʼserednyeʼ. Слово python3 адресоване оболонці й у список не потрапляє. А --dia і serednye для оболонки — два окремих слова: пару з них робить уже argparse, і робить це пізніше, у parse_args().
Питання 2 / 8

У скрипті описано add_argument("-t", "--tochnist", type=int, default=2). Користувач запустив його з --tochnist bagato. Що станеться?

Чому так. type=int — це не оголошення типу, а виклик функції int() над рядком. Вона кидає ValueError, але argparse перехоплює його й перетворює на людське invalid int value: ʼbagatoʼ. Далі — вихід із кодом 2, фіксована відповідь на будь-який зіпсований командний рядок. Підставити default при явно переданому значенні він не має права: це приховало б помилку.
Питання 3 / 8

Скрипт друкує рядок «оброблено 1240 рядків» звичайним print, і результат теж звичайним print. Що станеться в команді python3 zvit.py dani.csv | sort ?

Чому так. Конвеєр зʼєднує stdout лівої програми зі stdin правої, і наступна програма не має способу відрізнити службове повідомлення від даних. Помилки не буде — буде тихо зіпсований результат, а це гірше за падіння. Ліки — один іменований аргумент: print(..., file=sys.stderr) для всього, що не є результатом.
Питання 4 / 8

Нічне завдання виконує: zvit.py dani.csv > zvit.txt && nadislaty.py zvit.txt && echo готово. Що зміниться, якщо замінити && на крапку з комою?

Чому так. && пропускає далі лише після нульового коду, тому збій обриває ланцюг і назовні йде ненульовий код. Крапка з комою просто розділяє команди: виконаються всі, а echo $? покаже код останньої — нуль від echo. Збій посередині зникає безслідно, і завдання роками «успішно» відправляє порожні звіти.
Питання 5 / 8

Чому в зрілому скрипті пишуть def main(argv=None) з return 0, а sys.exit(main()) виносять під if __name__ == "__main__"?

Чому так. Два незалежних виграші. return замість sys.exit робить main звичайною функцією: у тесті її викликають зі своїм списком аргументів і порівнюють число, не ловлячи SystemExit. А захисна умова гарантує, що імпорт модуля не запустить роботу, — те саме правило, що й у темі 16.
Питання 6 / 8

Що передати в add_argument, щоб зробити прапорець «тихий режим» — такий, після якого не пишуть значення?

Чому так. action="store_true" означає «є в рядку — True, немає — False», і значення після прапорця не пишуть. Спокусливий type=bool працює не так, як здається: bool("False") — це True, бо непорожній рядок істинний. Тобто --tyho False увімкнув би режим замість вимкнути.
Питання 7 / 8

Скрипт отримав правильний командний рядок, але файлу, який попросили, не існує. Який код виходу він має повернути?

Чому так. Двійка — це відповідь argparse саме на зіпсований командний рядок. Тут рядок був бездоганний, просто зробити роботу не вийшло: це помилка виконання, і за домовленістю їй відповідає 1. Нуль тут неприпустимий — він означає «усе вийшло», і ланцюг із && спокійно поїхав би далі з порожнім файлом.
Питання 8 / 8

Що означає одинокий дефіс замість імені файлу в команді cat dani.csv | python3 zvit.py - ?

Чому так. Дефіс замість імені файлу розуміють майже всі утиліти командного рядка: він означає «джерело — sys.stdin». У argparse це вміє type=argparse.FileType("r"), який сам підставить stdin. А межу розбору позначає інший знак — подвійний --: усе після нього вважається значеннями, а не аргументами.