Полезные и малоизвестные функции Argparse из коробки
Argparse – модуль из стандартной библиотеки для работы с аргументами командной строки. Помимо стандартной функциональности в этом модуле есть много дополнительных фишек, о которых много, кто не знает, а зря: они бывают очень полезны. Давайте рассмотрим некоторые из них.
FileType
Часто в аргументах командной строки нужно передать путь до файла, чтобы потом из него что-то считать или записать в него. Обычно это делается с помощью строкового аргумента, но есть более подходящий для этого тип данных: файловый. В аргументах он принимает аргументы, которые он автоматически прокинет в функцию open вместе с указанным путём до файла и вернёт уже результат open, файловый объект. Удобная штука: позволяет писать немного меньше кода и добавить немного семантики.
Аббревиатуры аргументов По-умолчанию парсер умеет понимать сокращённые аргументы, состоящие из первых символов полных названий. Это значит, что если у нашего скрипта есть аргумент «file_to_save_extended_xlsx_report», при вызове его можно просто назвать, например «file» или «fi». При этом, если этой аббревиатуре удовлетворяют несколько аргументов, парсер это отследит и выдаст понятное сообщение об ошибке. Это поведение можно отключить у всего парсера целиком с помощью аргумента «allow_abbrev».
Действия с аргументами
Многие использовали стандартные действия (например, «store_true»), но оказывается, эти действия можно писать свои. Очень полезно особенно в тех случаях, когда прежде, чем с аргументом можно будет работать, с ним нужно сделать какие-то дополнительные действия. Например, мы принимаем JSON в качестве одного из аргументов и хотим его сначала распарсить, а потом использовать. Это можно сделать вне парсера, а можно сделать наследника класса argparse.Action, в котором будет происходить «json.loads». В результате мы получаем ещё более модульный и семантичный код.
Дочерние парсеры
Возможно, вы уже пользовались командой «git» и знаете, что у команды «git» свои аргументы, а у «git log» свои – со своим вспомогательным текстом и так для каждой команды. С помощью argparser можно сделать и такое: для этого существует механизм подключения дочерних парсеров к основным. Таким образом, несколько парсеров объединяются в один большой, разделённый на разные команды. Если вы делаете какую-то утилиту с масштабным консольным интерфейсом, это – ваш выбор.
Вот несколько малоизвестных функций из модуля argparse. Всё это есть в документации, так что не стесняйтесь её читать!
Есть вопрос? Напишите в комментариях!