Perché usare argparse anziché optparse?


290

Ho notato che la documentazione di Python 2.7 include ancora un altro modulo di analisi della riga di comando. Oltre a getopte optparseora abbiamo argparse.

Perché è stato ancora creato un altro modulo di analisi della riga di comando? Perché dovrei usarlo invece di optparse? Ci sono nuove funzionalità che dovrei conoscere?


8
O forse usare nessuno perché dal 2012 Python ha un facile, potente e davvero fresco modulo per argomento l'analisi chiamato docopt. docopt.org
ndemou,

1
prova a fare clic su è avvolgente optparse.
Amit Tripathi,

Risposte:


324

A partire da Python 2.7, optparseè deprecato e, si spera, andrà via in futuro.

argparseè migliore per tutti i motivi elencati nella sua pagina originale ( https://code.google.com/archive/p/argparse/ ):

  • gestione degli argomenti posizionali
  • supporto di comandi secondari
  • consentendo prefissi di opzioni alternative come +e/
  • gestione di zero o più argomenti e uno o più argomenti di stile
  • producendo messaggi di utilizzo più informativi
  • fornendo un'interfaccia molto più semplice per tipi e azioni personalizzati

Ulteriori informazioni si trovano anche in PEP 389 , che è il veicolo con cui argparseè entrato nella libreria standard.


18
Un'interfaccia molto più semplice per tipi personalizzati ... ma un'interfaccia più complessa in generale. Mi chiedo davvero perché sono passato a optparse, perché Drumroll Getopt rimarrà . Sì, nessuna deprecazione per quel dinosauro. Sheeesh.
Jürgen A. Erhard

4
La menzione di "purezza" optparsenel PEP, in seguito, argomentazioni su quanto sia complesso aggiungerlo per far sembrare che sia stato codificato per essere flessibile come il rock (male).
Nick T,

1
L'interfaccia dei sottocomandi è scadente. L'output predefinito non è utile e modificarlo è difficile.
Anatoly Techtonik,

Tieni presente che code.google.com andrà in manutenzione tra pochi giorni. Le differenze con maggiori dettagli sono disponibili qui: argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html
Jean-Francois T.

63

Perché dovrei usarlo invece di optparse? Sono le loro nuove funzionalità che dovrei conoscere?

@La risposta di Nicholas copre questo bene, penso, ma non la domanda più "meta" con cui inizi:

Perché è stato ancora creato un altro modulo di analisi della riga di comando?

Questo è il dilemma numero uno quando un modulo utile viene aggiunto alla libreria standard: cosa fai quando emerge un modo sostanzialmente migliore, ma incompatibile con le versioni precedenti, di fornire lo stesso tipo di funzionalità?

O ti attieni al vecchio modo e certamente superato (in genere quando parliamo di pacchetti complicati: asyncore vs twisted, tkinter vs wx o Qt, ...) o finisci con più modi incompatibili per fare la stessa cosa (XML i parser, IMHO, ne sono un esempio ancora migliore rispetto ai parser da riga di comando - ma il emailpacchetto contro i miriadi di vecchi modi di affrontare problemi simili non è neanche troppo lontano ;-).

Potresti fare dei brontoli minacciosi nei documenti sui vecchi modi di essere "deprecati", ma (fintanto che devi mantenere la retrocompatibilità) non puoi davvero toglierli senza fermare le applicazioni grandi e importanti dal passaggio alle nuove versioni di Python.

(Il dilemma numero due, non direttamente correlato alla tua domanda, è riassunto nel vecchio detto "la libreria standard è dove i buoni pacchetti vanno a morire" ... con versioni ogni anno e mezzo circa, pacchetti che non sono molto, molto stabile, non necessitando di rilasci più spesso di così, può effettivamente soffrire sostanzialmente di essere "congelato" nella libreria standard ... ma, questo è davvero un problema diverso).


Certo, puoi includere argparse.py per le installazioni di Python prima della 2.7 e non preoccuparti di modifiche incompatibili con le versioni precedenti. Cosa extra da tracciare, ma è ancora mantenuta al di fuori della libreria standard su argparse.googlecode.com
Ehtesh Choudhury,

2
Argparse è sostanzialmente migliore solo per alcuni usi (di nicchia?). Non è davvero migliore in termini assoluti, è diverso . Può fare cose che optparse non può, ma ha anche regressioni. Un esempio in cui mi sono appena imbattuto: optparse ha gestito "-" per impostazione predefinita (non sono sicuro che abbia fatto ciò che dovrebbe fare) mentre argparse non ne sa nulla.
Jürgen A. Erhard,

Per chiunque arrivi tardi al commento sopra, argparse ha impostato il prefisso e il nome e la maggior parte dei parser sono scritti come parser.add_argument('--long-opt', '-l',...); '-' viene gestito facilmente e come preferisci.
SilverbackNet,


18

Ci sono anche nuovi bambini sul blocco!

  • Oltre al già menzionato optparse deprecato . [NON USARE]
  • è stato anche menzionato argparse , che è una soluzione per le persone che non vogliono includere librerie esterne.
  • docopt è una libreria esterna che vale la pena guardare, che utilizza una stringa di documentazione come parser per l'input.
  • click è anche una libreria esterna e usa i decoratori per definire gli argomenti. (La mia fonte consiglia: Perché fare clic )
  • python-inquirer Per strumenti focalizzati sulla selezione e basati su Inquirer.js ( repo )

Se hai bisogno di un confronto più approfondito, leggi questo e potresti finire con docopt o fare clic . Grazie a Kyle Purdon!


4
mentre questo è un commento utile, è ancora un commento più che una risposta .. nessun voto negativo ma nessun voto positivo per me! Espandi la tua risposta con un prezioso riepilogo dell'articolo per trasformarlo in una vera risposta !: meta.stackexchange.com/a/8259/172394
Stefano

1
Ho provato a includere un riepilogo del mio link. Spero ora che valga la pena una buona risposta StackOverflow.
pazzo

6

All'inizio ero riluttante come @fmark a passare da optparse a argparse, perché:

  1. Pensavo che la differenza non fosse così grande.
  2. Un po 'di VPS fornisce ancora Python 2.6 per impostazione predefinita.

Poi ho visto questo documento, argparse supera Optparse, specialmente quando si parla di generare messaggi di aiuto significativi: http://argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html

E poi ho visto " argparse vs. optparse " di @Nicholas, dicendo che possiamo avere argparse disponibile in Python <2.7 (Sì, non lo sapevo prima.)

Ora le mie due preoccupazioni sono ben affrontate. Ho scritto questo sperando che possa aiutare gli altri con una mentalità simile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.