2010-07-10 6 views
237

Ho notato che la documentazione di Python 2.7 include ancora un altro modulo di analisi della riga di comando. Oltre a getopt e optparse ora abbiamo argparse.Perché usare argparse anziché optparse?

Perché è stato creato un altro modulo di analisi della riga di comando? Perché dovrei usarlo al posto di optparse? Ci sono nuove funzionalità che dovrei sapere?

+7

O forse non usare nessuno perché dal 2012 Python ha un modulo facile, potente e veramente * cool * per l'analisi degli argomenti chiamato docopt. http://docopt.org – ndemou

+1

prova a fare clic è wrapper around optparse. –

risposta

257

Come di pitone 2.7, optparse è obsoleto e, si spera andare via per il futuro.

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

  • gestione degli argomenti posizionali
  • sostegno comandi secondari
  • permettendo prefissi opzioni alternative come + e /
  • gestire argomenti di stile zero o più e uno o più stile
  • produce mo re messaggi informativi di utilizzo
  • fornendo un'interfaccia molto più semplice per i tipi personalizzati e azioni

Maggiori informazioni è anche in PEP 389, che è il veicolo attraverso il quale argparse reso nella libreria standard.

+14

Un'interfaccia molto più semplice per i tipi personalizzati ... ma un'interfaccia più complessa in generale. Mi chiedo davvero perché sono passato a optparse, perché * drumroll * getopt resterà * stay *. Sì, nessuna deprecazione per quel dinosauro. Sheeesh. –

+3

La menzione della "purezza" di "optparse" nel PEP e le argomentazioni successive su quanto sia complesso da aggiungere suona come se fosse codificato per essere flessibile come il rock (male). –

+1

L'interfaccia dei sottocomandi è scadente. L'output predefinito non è utile e cambiarlo è difficile. –

58

Perché dovrei usarlo invece di optparse? Le loro nuove funzionalità I dovrebbero essere a conoscenza?

@ risposta di Nicola copre bene, credo, ma non il più domanda "meta" si inizia con:

Perché è parsing stato creato l'ennesima riga di comando modulo?

Questo è il numero uno dilemma quando si aggiunge qualsiasi modulo utile alla libreria standard: cosa fare quando un sostanzialmente migliore, ma retro-compatibile, modo per fornire lo stesso tipo di funzionalità emerge?

O si bastone con il modo in cui vecchio e certamente superato (in genere quando si parla di pacchetti complicate: asyncore vs contorto, tkinter vs wx o Qt, ...) o si finisce con più modi incompatibili per fare il stessa cosa (i parser XML, IMHO, sono un esempio ancora migliore di questo rispetto ai parser da linea di comando - ma il pacchetto email rispetto alla miriade di vecchi metodi per affrontare problemi simili non è neanche lontanissimo ;-).

È possibile emettere minacce minacciose nei documenti sui vecchi modi di essere "deprecati", ma (purché sia ​​necessario mantenere la compatibilità con le versioni precedenti) non si può davvero portarli via senza fermare applicazioni grandi e importanti dal passare a nuove versioni di Python.

(Dilemma numero due, non direttamente legati alla tua domanda, è riassunta nel vecchio detto "la libreria standard è dove buoni pacchetti vanno a morire" ... con uscite ogni anno e mezzo o giù di lì, i pacchetti che aren 'molto, molto stabile, non, le versioni che richiedono più spesso di quello, possono effettivamente soffrire sostanzialmente di essere "congelate" nella libreria standard ... ma, questo è davvero un altro problema).

+0

Certamente, puoi includere argparse.py per le installazioni di python prima di 2.7 e non preoccuparti del backwards - cambiamenti non compatibili Cosa extra da tenere traccia, ma viene comunque mantenuta al di fuori della libreria standard di argparse.googlecode.com –

+2

Argparse è sostanzialmente migliore solo per alcuni usi (di nicchia?). Non è molto meglio in termini assoluti, è * diverso *. Può fare cose che non possono, ma ha anche regressioni. Un esempio in cui mi sono imbattuto in: optparse ha gestito "-" di default (non sono sicuro di aver fatto ciò che dovrebbe fare) mentre argparse non ne sa nulla. –

3

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

  1. ho pensato che la differenza non era enorme.
  2. Parecchi alcuni VPS forniscono ancora Python 2.6 per impostazione predefinita.

Poi vidi questo documento, argparse sorpassa optparse, soprattutto quando si parla di generazione di messaggio di aiuto significativo: 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 pitone < 2.7 (Sì, non lo sapevo prima.)

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

1

Io personalmente preferisco optparse piuttosto che argparse perché

  1. argparse è che ha alcuni comportamenti problematici che rendono la gestione delle interfacce della riga di comando arbitrario.

  2. argparse ha un comportamento magico incorporato per indovinare se qualcosa è un argomento o un'opzione. Questo diventa un problema quando si gestiscono le righe di comando incomplete poiché non è possibile sapere senza avere una piena comprensione della linea di comando su come si comporterà il parser.

  3. Attualmente argparse non supporta la disattivazione degli argomenti interspati.

Entrambi funzionano bene per le applicazioni di riga di comando di base.

+1

"argparse è che ha alcuni comportamenti problematici che rendono la gestione di interfacce di riga di comando arbitrarie". - Non riesco a capire cosa stai cercando di dire qui. Sembra che alla frase manchi un inizio e una fine. – Toastgeraet

+2

Perché è una copia e incolla non riuscita da [Confronto di clic] (http://click.pocoo.org/5/why/#why-not-argparse). – leesei

11

Ci sono anche nuovi bambini sul blocco!

  • Oltre al già citato obsoleto optparse. [NON UTILIZZARE]
  • argparse è stato anche menzionato, che è una soluzione per le persone che non desiderano includere librerie esterne.
  • docopt è una libreria esterna che vale la pena vedere, che utilizza una stringa di documentazione come parser per l'input.
  • click è anche lib esterna e utilizza decoratori per la definizione degli argomenti.(La mia fonte raccomanda: Why Click)

Se avete bisogno di un più approfondito rispetto leggere this e si può finire con docopt o click. Grazie a Kyle Purdon!

+0

mentre questo è un commento utile, è ancora un commento più di una risposta .. nessun downvote ma nessun upvote per anche io! Espandi la tua risposta con un riepilogo prezioso dell'articolo per trasformarlo in una vera risposta !: https://meta.stackexchange.com/a/8259/172394 – Stefano

+0

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