Warum Argparse anstelle von Optparse verwenden?

290

Ich habe festgestellt, dass die Python 2.7-Dokumentation ein weiteres Befehlszeilen-Parsing-Modul enthält. Neben getoptund haben optparsewir jetzt argparse.

Warum wurde ein weiteres Befehlszeilen-Parsing-Modul erstellt? Warum sollte ich es anstelle von verwenden optparse? Gibt es neue Funktionen, die ich kennen sollte?

fmark
quelle
8
Oder verwenden Sie keine, da Python seit 2012 ein einfaches, leistungsstarkes und wirklich cooles Modul zum Parsen von Argumenten namens docopt hat. docopt.org
ndemou
1
Versuchen Sie, darauf zu klicken, es ist ein Wrapper um Optparse.
Amit Tripathi

Antworten:

324

Ab Python 2.7, optparseist veraltet und wird in Zukunft hoffentlich weg.

argparseist aus allen auf der Originalseite aufgeführten Gründen besser ( https://code.google.com/archive/p/argparse/ ):

  • Umgang mit Positionsargumenten
  • Unterbefehle unterstützen
  • Zulassen alternativer Optionspräfixe wie +und/
  • Umgang mit Argumenten mit null oder mehr und einem oder mehreren Stilen
  • Erstellen informativerer Nutzungsnachrichten
  • Bereitstellung einer viel einfacheren Oberfläche für benutzerdefinierte Typen und Aktionen

Weitere Informationen finden Sie auch in PEP 389 , dem Fahrzeug, mit dem argparsees in die Standardbibliothek gelangt ist.

Nicholas Knight
quelle
18
Eine viel einfachere Oberfläche für benutzerdefinierte Typen ... aber insgesamt eine komplexere Oberfläche. Ich frage mich wirklich, warum ich überhaupt zu Optparse gewechselt bin, weil Drumroll Getopt bleiben wird . Ja, keine Abwertung für diesen Dinosaurier. Meine Güte.
Jürgen A. Erhard
4
Die Erwähnung von "Reinheit" optparsein der PEP führt später zu Argumenten darüber, wie komplex das Hinzufügen ist, damit es so klingt, als wäre es so flexibel wie Rock (schlecht).
Nick T
1
Die Schnittstelle für Unterbefehle ist schlecht. Die Standardausgabe ist nicht nützlich und das Ändern ist schwierig.
Anatoly Techtonik
Beachten Sie, dass code.google.com in wenigen Tagen gewartet wird. Unterschiede mit weiteren Details finden Sie hier: argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html
Jean-Francois T.
63

Warum sollte ich es anstelle von optparse verwenden? Sind ihre neuen Funktionen, über die ich Bescheid wissen sollte?

@ Nicholas 'Antwort deckt dies gut ab, denke ich, aber nicht die "Meta" -Frage, mit der Sie beginnen:

Warum wurde ein weiteres Befehlszeilen-Parsing-Modul erstellt?

Das ist das Dilemma Nummer eins, wenn ein nützliches Modul zur Standardbibliothek hinzugefügt wird: Was tun Sie, wenn sich eine wesentlich bessere, aber abwärtskompatible Möglichkeit ergibt, dieselbe Art von Funktionalität bereitzustellen?

Entweder bleiben Sie bei der alten und zugegebenermaßen übertroffenen Methode (normalerweise, wenn es sich um komplizierte Pakete handelt: Asyncore vs Twisted, Tkinter vs WX oder Qt, ...) oder Sie haben mehrere inkompatible Möglichkeiten, dasselbe zu tun (XML) Parser, IMHO, sind ein noch besseres Beispiel dafür als Kommandozeilen-Parser - aber das emailPaket im Vergleich zu den unzähligen alten Methoden, mit ähnlichen Problemen umzugehen, ist auch nicht allzu weit entfernt ;-).

Sie können in den Dokumenten bedrohlich darüber meckern, dass die alten Methoden "veraltet" sind, aber (solange Sie die Abwärtskompatibilität beibehalten müssen), können Sie sie nicht wirklich entfernen, ohne große, wichtige Anwendungen daran zu hindern, auf neuere Python-Versionen umzusteigen.

(Das Dilemma Nummer zwei, das nicht direkt mit Ihrer Frage zusammenhängt, ist in dem alten Sprichwort zusammengefasst: "In der Standardbibliothek sterben gute Pakete" ... mit Veröffentlichungen alle anderthalb Jahre oder so, Pakete, die nicht sehr sind, Sehr stabil, da sie nicht öfter veröffentlicht werden müssen, kann tatsächlich erheblich darunter leiden, dass sie in der Standardbibliothek "eingefroren" werden ... aber das ist wirklich ein anderes Problem.

Alex Martelli
quelle
Zugegeben, Sie können argparse.py für Python-Installationen vor 2.7 einschließen und müssen sich keine Gedanken über abwärtskompatible Änderungen machen. Zusätzliche Sache zu verfolgen, aber es wird immer noch außerhalb der Standardbibliothek unter argparse.googlecode.com
Ehtesh Choudhury
2
Argparse ist nur für einige (Nischen-?) Anwendungen wesentlich besser. In absoluten Zahlen ist es nicht wirklich besser, es ist anders . Es kann Dinge tun, die Optparse nicht kann, aber es hat auch Regressionen. Ein Beispiel, auf das ich gerade gestoßen bin: optparse hat standardmäßig "-" behandelt (nicht sicher, ob es das getan hat, was dies tun soll), während argparse nichts davon weiß.
Jürgen A. Erhard
Für alle , spät zu dem obigen Kommentar kommen, argparse hast du das Präfix und den Namen und die meisten Parser geschrieben , wie parser.add_argument('--long-opt', '-l',...); '-' ist einfach zu handhaben und wie Sie möchten.
SilverbackNet
18

Es gibt auch neue Kinder auf dem Block!

  • Neben dem bereits erwähnten veralteten Optparse . [VERWENDE NICHT]
  • Es wurde auch argparse erwähnt, eine Lösung für Leute, die nicht bereit sind, externe Bibliotheken einzubeziehen .
  • docopt ist eine externe Bibliothek , die einen Blick wert ist und eine Dokumentationszeichenfolge als Parser für Ihre Eingabe verwendet.
  • click ist auch eine externe Bibliothek und verwendet Dekoratoren zum Definieren von Argumenten. (Meine Quelle empfiehlt: Warum klicken )
  • python-enquirer Für auswahlorientierte Tools und basierend auf Inquirer.js ( repo )

Wenn Sie einen ausführlicheren Vergleich benötigen, lesen Sie diesen bitte und Sie können docopt verwenden oder klicken . Vielen Dank an Kyle Purdon!

Lony
quelle
4
Dies ist zwar ein lohnender Kommentar, aber es ist immer noch ein Kommentar mehr als eine Antwort. Kein Downvote, aber auch kein Upvote für mich! Erweitern Sie Ihre Antwort mit einer wertvollen Zusammenfassung des Artikels, um daraus eine echte Antwort zu machen !: Meta.stackexchange.com/a/8259/172394
Stefano
1
Ich habe versucht, eine Zusammenfassung meines Links aufzunehmen. Ich hoffe, jetzt ist es eine gute Antwort auf den Stapelüberlauf wert.
Lony
6

Anfangs war ich genauso zurückhaltend wie @fmark, von optparse zu argparse zu wechseln, weil:

  1. Ich dachte, der Unterschied sei nicht so groß.
  2. Einige VPS bieten standardmäßig immer noch Python 2.6 an.

Dann habe ich dieses Dokument gesehen, in dem argparse optparse übertrifft, insbesondere wenn es darum geht, eine aussagekräftige Hilfemeldung zu generieren: http://argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html

Und dann sah ich " argparse vs. optparse " von @Nicholas und sagte, wir könnten Argparse in Python <2.7 verfügbar haben (Ja, das wusste ich vorher nicht.)

Jetzt sind meine beiden Bedenken gut angesprochen. Ich habe dies in der Hoffnung geschrieben, dass es anderen mit einer ähnlichen Einstellung helfen wird.

RayLuo
quelle