2010-07-10 11 views
237

Zauważyłem, że dokumentacja w Pythonie 2.7 zawiera jeszcze jeden moduł do analizowania wiersza poleceń. Oprócz getopt i optparse mamy teraz argparse.Dlaczego warto używać argparse zamiast optparse?

Dlaczego został utworzony kolejny moduł analizy parsowania? Dlaczego powinienem go używać zamiast optparse? Czy są nowe funkcje, o których powinienem wiedzieć?

+7

A może nie używać, ponieważ od 2012 r. Python ma łatwy, wydajny i naprawdę * fajny * moduł do analizowania argumentów o nazwie docopt. http://docopt.org – ndemou

+1

spróbuj kliknąć to jest wrapper wokół optparse. –

Odpowiedz

257

Począwszy od pytona 2.7, optparse jest przestarzała, i miejmy nadzieję odejść w przyszłości.

argparse jest lepsza dla wszystkich powodów wymienionych w pierwotnej stronie (https://code.google.com/archive/p/argparse/):

  • obsługi pozycyjnych argumentów
  • nośne podkomendy
  • pozwalających alternatywne prefiksy opcji jak + i /
  • obsługa zero lub więcej i jeden lub więcej argumentów stylu
  • produ mo Re komunikatów informacyjnych użytkowania
  • świadczących o wiele prostszy interfejs do niestandardowych typów i działań

Więcej informacji znajduje się również w PEP 389, który to pojazd, w którym argparse trafiły do ​​biblioteki standardowej.

+14

O wiele prostszy interfejs dla niestandardowych typów ... ale bardziej złożony interfejs ogólnie. Naprawdę zastanawiam się, dlaczego przestawiłem się na optparse, ponieważ * drumroll * getopt * pozostanie *. Tak, bez deprecjacji dla tego dinozaura. Sheeesh. –

+3

Wzmianka o "czystości" słowa "optparse" w PEP, a następnie argumenty na temat tego, jak skomplikowane jest dodawanie, sprawia, że ​​brzmi to tak, jakby kodowanie było tak elastyczne jak skała (słabo). –

+1

Interfejs podpoltowy jest słaby. Domyślne wyjście nie jest przydatne i zmiana jest trudna. –

58

Dlaczego powinienem używać go zamiast optparse? Czy ich nowe funkcje, o których powinienem wiedzieć, to ?

@ odpowiedź Mikołaja Obejmuje to również, jak sądzę, ale nie bardziej „meta” Pytanie zacząć:

Dlaczego kolejny wiersza polecenia parsowania moduł został stworzony?

To numer jeden dylemat, gdy dowolny przydatny moduł jest dodawany do biblioteki standardowej: co zrobić, gdy znacznie lepiej, ale wstecznie kompatybilne, sposobem zapewnienia tego samego rodzaju funkcjonalności wyłania?

Albo trzymasz się starego i co prawda przerośniętego sposobu (zazwyczaj gdy mówimy o skomplikowanych paczkach: asyncore vs twisted, tkinter vs wx lub Qt, ...) lub kończysz na wielu niekompatybilnych sposobach zrobienia to samo (parsery XML, IMHO, są jeszcze lepszym tego przykładem niż parsery z wiersza poleceń - ale pakiet email w porównaniu z niezliczonymi dawnymi sposobami radzenia sobie z podobnymi problemami też nie jest zbyt daleko ;-).

Być może w dokumentach pojawiają się groźne pomruki na temat starych sposobów, które są "przestarzałe", ale (tak długo, jak zachowujecie kompatybilność wsteczną), nie można ich naprawdę zabrać bez zatrzymywania dużych, ważnych aplikacji z przeniesienia do nowsze wydania Pythona.

(Dylemat numer dwa, niezwiązany bezpośrednio z twoim pytaniem, jest streszczony w starym powiedzeniu "standardowa biblioteka jest tam, gdzie dobre pakiety idą na śmierć" ... z wydaniami co półtora roku, pakiety, które nie są dostępne 't bardzo, bardzo stabilny, nie potrzebujący wydania częściej niż to, może rzeczywiście cierpieć znacznie, będąc "zamrożony" w standardowej bibliotece ... ale, to naprawdę inny problem).

+0

Oczywiście można włączyć argparse.py dla instalacji Pythona przed wersją 2.7 i nie martwić się wstecz - Niezgodne zmiany. Dodatkowa rzecz do śledzenia, ale nadal jest utrzymywana poza standardową biblioteką na argparse.googlecode.com –

+2

Argparse jest znacznie lepsza tylko dla niektórych (niszowych?) Zastosowań. Nie jest to wcale lepsze pod względem wartości absolutnych, jest * inne *. Może robić rzeczy, których nie może optparse, ale ma również regresje. Jeden przykład, o którym właśnie natknąłem: domyślnie obsługiwany jest "-" (nie jestem pewien, czy zrobił to, co powinien), podczas gdy argparse nic o tym nie wie. –

3

Na początku byłem jak niechętnie jak @fmark aby przełączyć się z optparse do argparse, ponieważ:

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

Potem zobaczyłem ten dokument, argparse przewyższa optparse, zwłaszcza gdy mówimy o generowanie znaczących komunikat pomocy: http://argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html

I wtedy zobaczyłem "argparse vs. optparse" przez @Nicholas, mówiąc, możemy mieć argparse dostępne w python < 2.7 (Tak, nie wiedziałem o tym wcześniej.)

Teraz moje dwie sprawy są dobrze przemyślane. Napisałem to mając nadzieję, że pomoże to innym osobom o podobnym nastawieniu.

1

ja osobiście wolę optparse zamiast argparse ponieważ

  1. argparse jest to, że ma kilka problematycznych zachowań, które czynią obsługę dowolnych interfejsów wiersza poleceń.

  2. argparse ma wbudowane magiczne zachowanie, aby odgadnąć, czy coś jest argumentem czy opcją. Staje się to problemem, gdy mamy do czynienia z niekompletnymi liniami komend, ponieważ nie jest to możliwe bez pełnego zrozumienia linii poleceń, jak zachowuje się analizator składni.

  3. argparse obecnie nie obsługuje wyłączania przerywanych argumentów.

Oba działają dobrze w podstawowych aplikacjach linii poleceń.

+1

"argparse jest to, że ma pewne problemy, które powodują, że obsługa dowolnych interfejsów wiersza poleceń." - Nie mogę zrozumieć, co próbujesz tu powiedzieć. Wygląda na to, że w zdaniu brakuje początku i końca. – Toastgeraet

+2

Ponieważ jest to nieudana kopia i wklej z [Porównanie kliknięć] (http://click.pocoo.org/5/why/#why-not-argparse). – leesei

11

Są także nowe dzieci na bloku!

  • Oprócz wspomnianego już wycofanego optparse. [NIE UŻYWAJ]
  • argparse został również wymieniony, co jest rozwiązaniem dla osób, które nie chcą włączać zewnętrznych bibliotek.
  • docopt to biblioteka zewnętrzna, na którą warto zwrócić uwagę, wykorzystująca łańcuch dokumentacyjny jako analizator składni dla danych wejściowych.
  • kliknij przycisk jest również biblioteką zewnętrzną i używa dekoratorów do definiowania argumentów.(My źródło poleca: Why Click)

Jeśli potrzebujesz więcej w porównaniu głębokości proszę przeczytać this i może skończyć się za pomocą docopt lub kliknięcie. Dzięki Kyle Purdon!

+0

podczas gdy jest to komentarz warty uwagi, wciąż jest komentarzem więcej niż odpowiedzią .. nie w dół, ale bez upvote dla ja też! Poszerz swoją odpowiedź o cenne podsumowanie artykułu, aby uczynić z niego prawdziwą odpowiedź !: https://meta.stackexchange.com/a/8259/172394 – Stefano

+0

Próbowałem dołączyć podsumowanie mojego linka Mam nadzieję, że teraz warto dobra odpowiedź na pytanie o stackoverflow. – lony

Powiązane problemy