Скрипт запустили командою: python3 zvit.py prodazhi.csv --dia serednye. Чому дорівнює len(sys.argv)?
sys.argv лягають чотири рядки: ʼzvit.pyʼ, ʼprodazhi.csvʼ, ʼ--diaʼ, ʼserednyeʼ. Слово python3 адресоване оболонці й у список не потрапляє. А --dia і serednye для оболонки — два окремих слова: пару з них робить уже argparse, і робить це пізніше, у parse_args().У скрипті описано add_argument("-t", "--tochnist", type=int, default=2). Користувач запустив його з --tochnist bagato. Що станеться?
type=int — це не оголошення типу, а виклик функції int() над рядком. Вона кидає ValueError, але argparse перехоплює його й перетворює на людське invalid int value: ʼbagatoʼ. Далі — вихід із кодом 2, фіксована відповідь на будь-який зіпсований командний рядок. Підставити default при явно переданому значенні він не має права: це приховало б помилку.Скрипт друкує рядок «оброблено 1240 рядків» звичайним print, і результат теж звичайним print. Що станеться в команді python3 zvit.py dani.csv | sort ?
print(..., file=sys.stderr) для всього, що не є результатом.Нічне завдання виконує: zvit.py dani.csv > zvit.txt && nadislaty.py zvit.txt && echo готово. Що зміниться, якщо замінити && на крапку з комою?
&& пропускає далі лише після нульового коду, тому збій обриває ланцюг і назовні йде ненульовий код. Крапка з комою просто розділяє команди: виконаються всі, а echo $? покаже код останньої — нуль від echo. Збій посередині зникає безслідно, і завдання роками «успішно» відправляє порожні звіти.Чому в зрілому скрипті пишуть def main(argv=None) з return 0, а sys.exit(main()) виносять під if __name__ == "__main__"?
return замість sys.exit робить main звичайною функцією: у тесті її викликають зі своїм списком аргументів і порівнюють число, не ловлячи SystemExit. А захисна умова гарантує, що імпорт модуля не запустить роботу, — те саме правило, що й у темі 16.Що передати в add_argument, щоб зробити прапорець «тихий режим» — такий, після якого не пишуть значення?
action="store_true" означає «є в рядку — True, немає — False», і значення після прапорця не пишуть. Спокусливий type=bool працює не так, як здається: bool("False") — це True, бо непорожній рядок істинний. Тобто --tyho False увімкнув би режим замість вимкнути.Скрипт отримав правильний командний рядок, але файлу, який попросили, не існує. Який код виходу він має повернути?
argparse саме на зіпсований командний рядок. Тут рядок був бездоганний, просто зробити роботу не вийшло: це помилка виконання, і за домовленістю їй відповідає 1. Нуль тут неприпустимий — він означає «усе вийшло», і ланцюг із && спокійно поїхав би далі з порожнім файлом.Що означає одинокий дефіс замість імені файлу в команді cat dani.csv | python3 zvit.py - ?
sys.stdin». У argparse це вміє type=argparse.FileType("r"), який сам підставить stdin. А межу розбору позначає інший знак — подвійний --: усе після нього вважається значеннями, а не аргументами.