Dlaczego warto korzystać z argparse zamiast optparse?

290

Zauważyłem, że dokumentacja Python 2.7 zawiera jeszcze jeden moduł analizujący z wiersza poleceń. Oprócz getopti optparseteraz mamy argparse.

Dlaczego utworzono kolejny moduł analizujący z wiersza poleceń? Dlaczego powinienem go używać zamiast optparse? Czy są jakieś nowe funkcje, o których powinienem wiedzieć?

fmark
źródło
8
A może nie używaj żadnego, ponieważ od 2012 roku Python ma łatwy, wydajny i naprawdę fajny moduł do analizy argumentów o nazwie docopt. docopt.org
ndemou
1
spróbuj kliknąć to jest owinięte wokół optparse.
Amit Tripathi,

Odpowiedzi:

324

Począwszy od Pythona 2.7, optparsejest on przestarzały i mam nadzieję, że odejdzie w przyszłości.

argparsejest lepszy ze wszystkich powodów wymienionych na oryginalnej stronie ( https://code.google.com/archive/p/argparse/ ):

  • obsługa argumentów pozycyjnych
  • obsługa poleceń podrzędnych
  • dopuszczanie alternatywnych prefiksów opcji, takich jak +i/
  • obsługa zerowego lub więcej i jednego lub więcej argumentów stylu
  • generowanie bardziej pouczających komunikatów użytkowania
  • zapewniając znacznie prostszy interfejs dla niestandardowych typów i akcji

Więcej informacji znajduje się również w PEP 389 , który jest narzędziem, dzięki któremu argparsetrafił do standardowej biblioteki.

Nicholas Knight
źródło
18
Znacznie prostszy interfejs dla niestandardowych typów ... ale ogólnie bardziej złożony interfejs. Naprawdę zastanawiam się, dlaczego w ogóle zdecydowałem się na optparse , ponieważ drumroll getopt pozostanie . Tak, nie ma deprecjacji dla tego dinozaura. Sheeesh.
Jürgen A. Erhard
4
Wzmianka o „czystości” optparsew PEP, a następnie późniejsze argumenty o tym, jak skomplikowane jest dodanie, sprawia, że ​​brzmi, jakby był zakodowany tak elastycznie jak rock (słabo).
Nick T
1
Interfejs podkomend jest słaby. Domyślne wyjście nie jest przydatne, a zmiana jest trudna.
anatoly techtonik
Pamiętaj, że code.google.com przejdzie do Konserwacji za kilka dni. Różnice z bardziej szczegółowymi informacjami są dostępne tutaj: argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html
Jean-Francois T.
63

Dlaczego powinienem go używać zamiast optparse? Czy powinienem wiedzieć o ich nowych funkcjach?

@ Odpowiedź Mikołaja obejmuje to dobrze, jak sądzę, ale nie bardziej „meta” pytanie, które zaczynasz:

Dlaczego utworzono kolejny moduł analizujący z wiersza poleceń?

To jest dylemat numer jeden, gdy do standardowej biblioteki dodaje się jakiś przydatny moduł: co robisz, gdy pojawia się znacznie lepszy, ale wstecznie niekompatybilny sposób na zapewnienie tego samego rodzaju funkcjonalności?

Albo trzymasz się starej i, co prawda, przewyższonej metody (zwykle, gdy mówimy o skomplikowanych pakietach: asyncore vs twisted, tkinter vs wx lub Qt, ...) albo masz wiele niezgodnych sposobów na zrobienie tego samego (XML parsery, IMHO, są jeszcze lepszym przykładem tego niż parsery wiersza poleceń - ale emailpakiet w porównaniu z niezliczonymi starymi sposobami radzenia sobie z podobnymi problemami też nie jest zbyt daleko ;-).

Możesz sprawiać, że groźne narzekanie w dokumentach mówi o „przestarzałych” starych sposobach, ale (dopóki musisz zachować kompatybilność wsteczną), tak naprawdę nie możesz ich zabrać bez zatrzymania dużych, ważnych aplikacji przed przejściem do nowszych wersji Pythona.

(Dylemat numer dwa, niezwiązany bezpośrednio z twoim pytaniem, jest streszczony w starym powiedzeniu: „w standardowej bibliotece jest miejsce, gdzie giną dobre pakiety” ... z wydaniami co półtora roku, pakietami niezbyt, bardzo stabilny, nie wymagający częstszych wydań, może w rzeczywistości znacznie ucierpieć z powodu „zamrożenia” w standardowej bibliotece ... ale to naprawdę inna kwestia).

Alex Martelli
źródło
Trzeba oczywiście dołączyć argparse.py do instalacji Pythona przed wersją 2.7 i nie martwić się o niezgodne wstecz zmiany. Dodatkowa rzecz do śledzenia, ale nadal jest utrzymywana poza standardową biblioteką na
argparse.googlecode.com
2
Argparse jest znacznie lepszy tylko dla niektórych (niszowych?) Zastosowań. Absolutnie nie jest tak naprawdę lepszy, jest inny . Może robić rzeczy, których nie potrafi optparse, ale ma także regresje. Jeden przykład, na który właśnie wpadłem: domyślnie obsługiwane przez optparse „-” (nie jestem pewien, czy zrobiło to, co powinno), podczas gdy argparse nic o tym nie wie.
Jürgen A. Erhard
Dla każdego, kto spóźni się na powyższy komentarz, argparse ustawia prefiks i nazwę, a większość parserów zapisana jest jako parser.add_argument('--long-opt', '-l',...); „-” jest obsługiwane z łatwością i jak chcesz.
SilverbackNet
18

W bloku są też nowe dzieci!

  • Oprócz wspomnianej już przestarzałej optyki . [NIE UŻYWAĆ]
  • wspomniano również o argparse , które jest rozwiązaniem dla osób, które nie chcą dołączać zewnętrznych bibliotek.
  • docopt to zewnętrzna biblioteka warta obejrzenia, która wykorzystuje ciąg dokumentacji jako analizator składni danych wejściowych.
  • click jest także zewnętrzną biblioteką lib i używa dekoratorów do definiowania argumentów. (Moje źródło zaleca: Dlaczego Kliknij )
  • python-inquirer Do narzędzi ukierunkowanych na wybór i opartych na Inquirer.js ( repo )

Jeśli potrzebujesz bardziej szczegółowego porównania, przeczytaj to, a możesz skończyć używając docopt lub kliknij . Dzięki Kyle Purdon!

lony
źródło
4
chociaż jest to wart zachodu komentarz, to wciąż jest komentarzem więcej niż odpowiedzią .. nie głosuj negatywnie, ale nie oceniaj mnie też! Rozszerz swoją odpowiedź o cenne streszczenie artykułu, aby zamienić go w prawdziwą odpowiedź !: meta.stackexchange.com/a/8259/172394
Stefano
1
Próbowałem załączyć streszczenie mojego linku. Mam nadzieję, że teraz jest warta dobrej odpowiedzi na przepełnienie stosu.
lony
6

Na początku byłem tak niechętny jak @fmark, aby przejść z optparse na argparse, ponieważ:

  1. Myślałem, że różnica nie była aż tak duża.
  2. Całkiem niektóre VPS nadal domyślnie zapewnia Python 2.6.

Potem zobaczyłem ten dokument, argparse przewyższa optparse, szczególnie gdy mówię o generowaniu sensownego komunikatu pomocy: http://argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html

A potem zobaczyłem „ argparse vs. optparse ” autorstwa @Nicholas, mówiąc, że możemy mieć argparse dostępny w pythonie <2.7 (Tak, wcześniej tego nie wiedziałem).

Teraz moje dwie obawy zostały dobrze rozwiązane. Napisałem to z nadzieją, że pomoże innym o podobnym sposobie myślenia.

RayLuo
źródło