Зачем использовать argparse, а не optparse? - PullRequest
270 голосов
/ 10 июля 2010

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

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

Ответы [ 5 ]

300 голосов
/ 10 июля 2010

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

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

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

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

60 голосов
/ 10 июля 2010

Почему я должен использовать это вместо optparse? Являются ли их новые функции я должен знать о?

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

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

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

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

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

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

34 голосов
/ 10 июля 2010

Лучшим источником для обоснования добавления Python является его PEP: PEP 389: argparse - Новый модуль синтаксического анализа командной строки , в частности, раздел, озаглавленный Почему не используются getopt идостаточно непонятно?

14 голосов
/ 10 марта 2016

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

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

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

4 голосов
/ 06 апреля 2013

Сначала я так же неохотно, как @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 (Да, я не знал этого раньше.) </p>

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

...