Навіщо використовувати argparse, а не optparse?


290

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

Чому створений ще один модуль розбору командного рядка? Чому я повинен використовувати його замість optparse? Чи є нові функції, про які я повинен знати?


8
Або, можливо, не використовувати жодного, оскільки з 2012 року Python має простий, потужний і дуже класний модуль для розбору аргументів під назвою docopt. docopt.org
ndemou

1
спробуйте натиснути його обгорткою навколо optparse.
Аміт Трипаті

Відповіді:


324

Що стосується пітона 2.7, то він optparseє застарілим і, сподіваємось, піде в майбутньому.

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

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

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


18
Набагато простіший інтерфейс для користувацьких типів ... але в цілому більш складний інтерфейс. Мені справді цікаво, чому я навіть перейшов на optparse, тому що getopt барабану залишиться . Так, жодного знецінення цього динозавра. Sheeesh.
Юрген А. Ерхард

4
Згадка про "чистоту" optparseв ПЕП потім пізніші аргументи про те, наскільки складно додати, щоб звучати так, ніби він був закодований таким же гнучким, як і скеля (погано).
Нік Т

1
Інтерфейс підкоманд поганий. Вихід за замовчуванням не корисний, і змінити його важко.
anatoly techtonik

Зауважте, що 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
Ехтеш Чудхурі

2
Argparse істотно кращий лише для деяких (нішевих) застосувань. Це не дуже краще в абсолютних показниках, це інакше . Він може робити те, що optparse не може, але також має регресії. Один із прикладів, який я щойно зіткнувся: optparse обробляв "-" за замовчуванням (не впевнений, що він робив те, що це повинно робити), в той час як argparse нічого з цього не знає.
Юрген А. Ерхард

Для тих, хто пізно приходить до вищевказаного коментаря, argparse встановив префікс та ім'я, а більшість парсерів записуються як parser.add_argument('--long-opt', '-l',...); "-" обробляється легко, але як би ви не хотіли.
SilverbackNet


18

На блоці також є нові діти!

  • Окрім уже згаданого застарілого оптипару . [НЕ ВИКОРИСТОВУВАТИ]
  • Згадувався також аргпарсе , що є рішенням для людей, які не бажають включати зовнішні зв'язки.
  • docopt - це зовнішня лінза , на яку варто звернути увагу, яка використовує рядок документації як аналізатор вашого введення.
  • click також є зовнішньою lib і використовує декоратори для визначення аргументів. (Моє джерело рекомендує: Чому натискати )
  • python-inquirr Для інструментів, орієнтованих на вибір, та заснованих на Inquirer.js ( repo )

Якщо вам потрібно більш поглиблене порівняння, будь ласка, прочитайте це, і ви, можливо, скористаєтеся docopt або клацніть . Дякую Кайлу Пурдону!


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

І тоді я побачив @ argolse vs. optparse від @Nicholas, кажучи, що ми можемо мати argparse доступний у python <2.7 (Так, я раніше цього не знав.)

Зараз мої дві проблеми добре вирішені. Я написав це, сподіваючись, що це допоможе іншим із подібним мисленням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.