Зачем использовать argparse, а не optparse?

290

Я заметил, что документация Python 2.7 включает в себя еще один модуль синтаксического анализа командной строки. Кроме того getoptи optparseу нас теперь есть argparse.

Почему был создан еще один модуль синтаксического анализа командной строки? Почему я должен использовать это вместо optparse? Есть ли новые функции, о которых я должен знать?

fmark
источник
8
Или, возможно, не используйте ничего, потому что с 2012 года в Python появился простой, мощный и действительно классный модуль для анализа аргументов, называемый docopt. docopt.org
ndemou
1
попробуйте нажать это обертка вокруг optparse.
Амит Трипати

Ответы:

324

Что касается python 2.7, optparseон устарел и, надеюсь, уйдет в будущем.

argparseлучше по всем причинам, перечисленным на его исходной странице ( https://code.google.com/archive/p/argparse/ ):

  • обработка позиционных аргументов
  • вспомогательные подкоманды
  • разрешить альтернативные префиксы опций, такие как +и/
  • обработка ноль или более или один или более аргументов стиля
  • создание более информативных сообщений об использовании
  • обеспечение гораздо более простого интерфейса для пользовательских типов и действий

Более подробная информация также содержится в PEP 389 , который является средством, с помощью которого argparseон попал в стандартную библиотеку.

Николас Найт
источник
18
Гораздо более простой интерфейс для пользовательских типов ... но в целом более сложный интерфейс. Я действительно удивляюсь, почему я даже перешел на optparse, потому что getopt с барабанной дробью останется . Да, нет никакого осуждения для этого динозавра. Sheeesh.
Юрген А. Эрхард
4
Упоминание «чистоты» optparseв PEP затем приводит аргументы о том, насколько сложным является добавление к нему, и звучит так, как будто оно закодировано, чтобы быть таким же гибким, как рок (плохо).
Ник Т
1
Интерфейс подкоманд плохой. Вывод по умолчанию бесполезен, и изменить его сложно.
анатолий техтоник
Обратите внимание, что code.google.com перейдет на обслуживание через несколько дней. Различия с более подробной информацией доступны здесь: argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html
Жан-Франсуа Т.
63

Почему я должен использовать его вместо optparse? Это их новые функции, о которых я должен знать?

Я думаю, что ответ @ Николаса охватывает это хорошо, но не более мета-вопрос, с которого вы начинаете:

Почему был создан еще один модуль синтаксического анализа командной строки?

Это дилемма номер один, когда в стандартную библиотеку добавляется какой-либо полезный модуль: что вы делаете, когда появляется существенно лучший, но несовместимый с предыдущими версиями способ обеспечения такой же функциональности?

Либо вы придерживаетесь старого и общепризнанного способа (обычно, когда мы говорим о сложных пакетах: asyncore vs twisted, tkinter vs wx или Qt, ...), или вы в конечном итоге получаете несколько несовместимых способов сделать одно и то же (XML) парсеры, IMHO, являются еще лучшим примером этого, чем парсеры командной строки - но emailпакет против множества старых способов решения подобных проблем тоже не слишком далеко ;-).

В документах вы можете угрожающе ворчать о том, что старые способы «устарели», но (если вам необходимо поддерживать обратную совместимость) вы не сможете их убрать, не остановив крупные важные приложения от перехода на новые версии Python.

(Дилемма номер два, напрямую не связанная с вашим вопросом, резюмируется в старой поговорке «стандартная библиотека - это то место, куда умирают хорошие пакеты» ... с выпусками раз в полтора года или около того, пакеты не очень, очень стабильный, не нуждающийся в выпусках чаще, чем он, может существенно пострадать, будучи "замороженным" в стандартной библиотеке ... но это действительно другая проблема).

Алекс Мартелли
источник
По общему признанию, вы можете включить argparse.py для установок Python до 2.7 и не беспокоиться о обратно несовместимых изменениях. Дополнительную информацию для отслеживания, но она по-прежнему поддерживается за пределами стандартной библиотеки по адресу argparse.googlecode.com
Ehtesh Choudhury,
2
Argparse существенно лучше только для некоторых (нишевых?) Применений. Это не совсем лучше в абсолютном выражении, это другое . Он может делать то, чего не может быть optparse, но у него также есть регрессии. Один пример, с которым я только что столкнулся: optparse обрабатывается "-" по умолчанию (не уверен, что он сделал то, что должен делать), в то время как argparse ничего не знает об этом.
Юрген А. Эрхард
Для тех, кто приходит к вышеупомянутому комментарию с опозданием, argparse задает префикс и имя, и большинство анализаторов записываются как parser.add_argument('--long-opt', '-l',...); '-' легко обрабатывается, и как вам угодно.
SilverbackNet
18

Есть также новые дети на блоке!

  • Помимо уже упомянутого устаревшего optparse . [НЕ ИСПОЛЬЗУЙ]
  • Был также упомянут argparse , который является решением для людей, не желающих включать внешние библиотеки.
  • docopt - это внешняя библиотека , на которую стоит обратить внимание, которая использует строку документации в качестве парсера для вашего ввода.
  • click также является внешней библиотекой и использует декораторы для определения аргументов. (Мой источник рекомендует: зачем кликать )
  • python-inquirer Для выбора целевых инструментов и на основе Inquirer.js ( репо )

Если вам нужно более глубокое сравнение, прочитайте это, и вы можете использовать docopt или click . Спасибо Кайлу Пурдону!

Lony
источник
4
в то время как это заслуживающий внимания комментарий, он все же является комментарием, а не ответом… никакого отрицательного голоса, но никакого повышенного для меня тоже нет! Расширьте свой ответ ценным резюме статьи, чтобы превратить его в реальный ответ!: Meta.stackexchange.com/a/8259/172394
Стефано
1
Я попытался включить краткое изложение моей ссылки. Надеюсь, теперь это стоит хорошего ответа от stackoverflow.
одинокий
6

Сначала я так же неохотно, как @fmark, переключался с optparse на argparse, потому что:

  1. Я думал, что разница не так уж велика.
  2. Некоторые VPS по-прежнему предоставляют Python 2.6 по умолчанию.

Затем я увидел этот документ, argparse превосходит optparse, особенно когда речь идет о создании значимого справочного сообщения: http://argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html

А потом я увидел « argparse vs. optparse » от @Nicholas, который сказал, что argparse может быть доступен на python <2.7 (Да, я не знал этого раньше).

Теперь мои две проблемы хорошо решены. Я написал это, надеясь, что это поможет другим с подобным мышлением.

RayLuo
источник