Pourquoi utiliser argparse plutôt que optparse?

290

J'ai remarqué que la documentation Python 2.7 inclut encore un autre module d'analyse en ligne de commande. En plus de getoptet optparsenous avons maintenant argparse.

Pourquoi un autre module d'analyse de ligne de commande a-t-il été créé? Pourquoi devrais-je l'utiliser à la place de optparse? Y a-t-il de nouvelles fonctionnalités que je devrais connaître?

fmark
la source
8
Ou peut-être n'en utiliser aucun parce que depuis 2012 Python a un module simple, puissant et vraiment cool pour l'analyse des arguments appelé docopt. docopt.org
ndemou
1
essayez de cliquer c'est un wrapper autour optparse.
Amit Tripathi

Réponses:

324

En tant que python 2.7, il optparseest obsolète et devrait disparaître à l'avenir.

argparseest préférable pour toutes les raisons énumérées sur sa page d'origine ( https://code.google.com/archive/p/argparse/ ):

  • gestion des arguments positionnels
  • prise en charge des sous-commandes
  • permettant des préfixes d'option alternatifs comme +et/
  • gestion des arguments de style zéro ou plus et un ou plusieurs
  • produire des messages d'utilisation plus informatifs
  • fournissant une interface beaucoup plus simple pour les types et actions personnalisés

Plus d'informations se trouvent également dans PEP 389 , qui est le véhicule par lequel argparseil a été intégré à la bibliothèque standard.

Nicholas Knight
la source
18
Une interface beaucoup plus simple pour les types personnalisés ... mais une interface plus complexe dans l'ensemble. Je me demande vraiment pourquoi je suis même passé à optparse, car drumroll getopt restera . Oui, pas de dépréciation pour ce dinosaure. Sheeesh.
Jürgen A. Erhard
4
La mention de la «pureté» optparsedans le PEP, puis des arguments ultérieurs sur la complexité à ajouter, donne l'impression qu'il a été codé pour être aussi flexible que le rock (mal).
Nick T
1
L'interface des sous-commandes est médiocre. La sortie par défaut n'est pas utile et la modifier est difficile.
anatoly techtonik
Notez que code.google.com passera en maintenance dans quelques jours. Des différences avec plus de détails sont disponibles ici: argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html
Jean-Francois T.
63

Pourquoi devrais-je l'utiliser au lieu d'Optparse? Est-ce que je devrais connaître leurs nouvelles fonctionnalités?

@ La réponse de Nicholas couvre bien cela, je pense, mais pas la question la plus "méta" avec laquelle vous commencez:

Pourquoi un autre module d'analyse de ligne de commande a-t-il été créé?

C'est le dilemme numéro un lorsque n'importe quel module utile est ajouté à la bibliothèque standard: que faites-vous quand une manière sensiblement meilleure, mais rétrocompatible, de fournir le même type de fonctionnalité émerge?

Soit vous vous en tenez à l'ancienne et certes dépassée (généralement lorsque nous parlons de packages compliqués: asyncore vs twisted, tkinter vs wx ou Qt, ...) ou vous vous retrouvez avec plusieurs façons incompatibles de faire la même chose (XML analyseurs, à mon humble avis, sont un exemple encore meilleur de cela que les analyseurs de ligne de commande - mais le email package par rapport à la myriade d'anciennes façons de traiter des problèmes similaires n'est pas trop loin non plus ;-).

Vous pouvez faire des grognements menaçants dans les documents sur les anciennes méthodes étant "obsolètes", mais (tant que vous devez garder la compatibilité descendante), vous ne pouvez pas vraiment les supprimer sans empêcher de grandes applications importantes de passer aux versions Python plus récentes.

(Le dilemme numéro deux, qui n'est pas directement lié à votre question, est résumé dans le vieil adage "la bibliothèque standard est l'endroit où les bons packages disparaissent" ... avec des versions tous les ans et demi environ, des packages qui ne sont pas très, très stable, n'ayant pas besoin de versions plus souvent que cela, peut en fait souffrir considérablement en étant "gelé" dans la bibliothèque standard ... mais, c'est vraiment un problème différent).

Alex Martelli
la source
Certes, vous pouvez inclure argparse.py pour les installations python avant 2.7 et ne pas vous soucier des modifications incompatibles en amont. Chose supplémentaire à suivre, mais elle est toujours maintenue en dehors de la bibliothèque standard sur argparse.googlecode.com
Ehtesh Choudhury
2
Argparse n'est nettement meilleur que pour certaines utilisations (de niche?). Ce n'est pas vraiment mieux en termes absolus, c'est différent . Il peut faire des choses que l'optparse ne peut pas faire, mais il a aussi des régressions. Un exemple que je viens de rencontrer: optparse a géré "-" par défaut (je ne suis pas sûr qu'il ait fait ce que cela est censé faire) alors que argparse n'en sait rien.
Jürgen A. Erhard
Pour quiconque arrive tard dans le commentaire ci-dessus, argparse vous a défini le préfixe et le nom, et la plupart des analyseurs sont écrits comme parser.add_argument('--long-opt', '-l',...); '-' est géré facilement, et comme vous le souhaitez.
SilverbackNet
18

Il y a aussi de nouveaux enfants sur le bloc!

  • Outre l' optparse déjà mentionnée . [NE PAS UTILISER]
  • argparse a également été mentionné, ce qui est une solution pour les personnes qui ne souhaitent pas inclure de bibliothèques externes.
  • docopt est une bibliothèque externe qui mérite d'être examinée, qui utilise une chaîne de documentation comme analyseur pour votre entrée.
  • click est également une bibliothèque externe et utilise des décorateurs pour définir les arguments. (Ma source recommande: Pourquoi cliquer )
  • python-inquirer Pour les outils de sélection et basés sur Inquirer.js ( repo )

Si vous avez besoin d'une comparaison plus approfondie, veuillez lire ceci et vous pourriez finir par utiliser docopt ou cliquer . Merci à Kyle Purdon!

lony
la source
4
bien que ce soit un commentaire valable, c'est toujours un commentaire plus qu'une réponse .. pas de downvote mais pas de upvote pour moi non plus! Développez votre réponse avec un précieux résumé de l'article pour en faire une vraie réponse!: Meta.stackexchange.com/a/8259/172394
Stefano
1
J'ai essayé d'inclure un résumé de mon lien, j'espère que cela vaut maintenant une bonne réponse stackoverflow.
lony
6

Au début, j'étais aussi réticent que @fmark à passer de optparse à argparse, car:

  1. Je pensais que la différence n'était pas si énorme.
  2. Beaucoup de VPS fournissent toujours Python 2.6 par défaut.

Ensuite, j'ai vu ce document, argparse surpasse optparse, en particulier lorsqu'il s'agit de générer un message d'aide significatif: http://argparse.googlecode.com/svn/trunk/doc/argparse-vs-optparse.html

Et puis j'ai vu " argparse vs optparse " par @Nicholas, disant que nous pouvons avoir argparse disponible en python <2.7 (Oui, je ne le savais pas avant.)

Maintenant, mes deux préoccupations sont bien prises en compte. J'ai écrit cela en espérant que cela aiderait les autres avec un état d'esprit similaire.

RayLuo
la source