0 added
0 removed
Original
2026-01-01
Modified
2026-03-10
1
<p>Теги: python, функция open, argparse, аргументы командной строки, аббревиатуры аргументов, парсер, allow_abbrev, store_true, json, argparse.action, json.loads, web, web development, дочерние парсеры, argparser</p>
1
<p>Теги: python, функция open, argparse, аргументы командной строки, аббревиатуры аргументов, парсер, allow_abbrev, store_true, json, argparse.action, json.loads, web, web development, дочерние парсеры, argparser</p>
2
<p>Argparse - модуль из стандартной библиотеки для работы с аргументами командной строки. Помимо стандартной функциональности в этом модуле есть много дополнительных фишек, о которых много, кто не знает, а зря: они бывают очень полезны. Давайте рассмотрим некоторые из них.</p>
2
<p>Argparse - модуль из стандартной библиотеки для работы с аргументами командной строки. Помимо стандартной функциональности в этом модуле есть много дополнительных фишек, о которых много, кто не знает, а зря: они бывают очень полезны. Давайте рассмотрим некоторые из них.</p>
3
<h2>FileType</h2>
3
<h2>FileType</h2>
4
<p>Часто в аргументах командной строки нужно передать путь до файла, чтобы потом из него что-то считать или записать в него. Обычно это делается с помощью строкового аргумента, но есть более подходящий для этого тип данных: файловый. В аргументах он принимает аргументы, которые он автоматически прокинет в функцию<strong>open</strong>вместе с указанным путём до файла и вернёт уже результат<strong>open</strong>, файловый объект. Удобная штука: позволяет писать немного меньше кода и добавить немного семантики.</p>
4
<p>Часто в аргументах командной строки нужно передать путь до файла, чтобы потом из него что-то считать или записать в него. Обычно это делается с помощью строкового аргумента, но есть более подходящий для этого тип данных: файловый. В аргументах он принимает аргументы, которые он автоматически прокинет в функцию<strong>open</strong>вместе с указанным путём до файла и вернёт уже результат<strong>open</strong>, файловый объект. Удобная штука: позволяет писать немного меньше кода и добавить немного семантики.</p>
5
<p><strong>Аббревиатуры аргументов</strong>По-умолчанию парсер умеет понимать сокращённые аргументы, состоящие из первых символов полных названий. Это значит, что если у нашего скрипта есть аргумент<strong>"file_to_save_extended_xlsx_report"</strong>, при вызове его можно просто назвать, например "file" или "fi". При этом, если этой аббревиатуре удовлетворяют несколько аргументов, парсер это отследит и выдаст понятное сообщение об ошибке. Это поведение можно отключить у всего парсера целиком с помощью аргумента<strong>"allow_abbrev"</strong>.</p>
5
<p><strong>Аббревиатуры аргументов</strong>По-умолчанию парсер умеет понимать сокращённые аргументы, состоящие из первых символов полных названий. Это значит, что если у нашего скрипта есть аргумент<strong>"file_to_save_extended_xlsx_report"</strong>, при вызове его можно просто назвать, например "file" или "fi". При этом, если этой аббревиатуре удовлетворяют несколько аргументов, парсер это отследит и выдаст понятное сообщение об ошибке. Это поведение можно отключить у всего парсера целиком с помощью аргумента<strong>"allow_abbrev"</strong>.</p>
6
<h2>Действия с аргументами</h2>
6
<h2>Действия с аргументами</h2>
7
<p>Многие использовали стандартные действия (например,<strong>"store_true"</strong>), но оказывается, эти действия можно писать свои. Очень полезно особенно в тех случаях, когда прежде, чем с аргументом можно будет работать, с ним нужно сделать какие-то дополнительные действия. Например, мы принимаем<strong>JSON</strong>в качестве одного из аргументов и хотим его сначала распарсить, а потом использовать. Это можно сделать вне парсера, а можно сделать наследника класса<strong>argparse.Action</strong>, в котором будет происходить<strong>"json.loads"</strong>. В результате мы получаем ещё более модульный и семантичный код.</p>
7
<p>Многие использовали стандартные действия (например,<strong>"store_true"</strong>), но оказывается, эти действия можно писать свои. Очень полезно особенно в тех случаях, когда прежде, чем с аргументом можно будет работать, с ним нужно сделать какие-то дополнительные действия. Например, мы принимаем<strong>JSON</strong>в качестве одного из аргументов и хотим его сначала распарсить, а потом использовать. Это можно сделать вне парсера, а можно сделать наследника класса<strong>argparse.Action</strong>, в котором будет происходить<strong>"json.loads"</strong>. В результате мы получаем ещё более модульный и семантичный код.</p>
8
<h2>Дочерние парсеры</h2>
8
<h2>Дочерние парсеры</h2>
9
<p>Возможно, вы уже пользовались командой<strong>"git"</strong>и знаете, что у команды<strong>"git"</strong>свои аргументы, а у<strong>"git log"</strong>свои - со своим вспомогательным текстом и так для каждой команды. С помощью<strong>argparser</strong>можно сделать и такое: для этого существует механизм подключения дочерних парсеров к основным. Таким образом, несколько парсеров объединяются в один большой, разделённый на разные команды. Если вы делаете какую-то утилиту с масштабным консольным интерфейсом, это - ваш выбор.</p>
9
<p>Возможно, вы уже пользовались командой<strong>"git"</strong>и знаете, что у команды<strong>"git"</strong>свои аргументы, а у<strong>"git log"</strong>свои - со своим вспомогательным текстом и так для каждой команды. С помощью<strong>argparser</strong>можно сделать и такое: для этого существует механизм подключения дочерних парсеров к основным. Таким образом, несколько парсеров объединяются в один большой, разделённый на разные команды. Если вы делаете какую-то утилиту с масштабным консольным интерфейсом, это - ваш выбор.</p>
10
<p>Вот несколько малоизвестных функций из модуля<strong>argparse</strong>. Всё это есть в документации, так что не стесняйтесь её читать!</p>
10
<p>Вот несколько малоизвестных функций из модуля<strong>argparse</strong>. Всё это есть в документации, так что не стесняйтесь её читать!</p>
11
<p><em>Есть вопрос? Напишите в комментариях!</em></p>
11
<p><em>Есть вопрос? Напишите в комментариях!</em></p>
12
12