J'ai remarqué que la documentation Python 2.7 inclut encore un autre module d'analyse en ligne de commande. En plus de getopt
et optparse
nous 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?
Réponses:
En tant que python
2.7
, iloptparse
est obsolète et devrait disparaître à l'avenir.argparse
est préférable pour toutes les raisons énumérées sur sa page d'origine ( https://code.google.com/archive/p/argparse/ ):+
et/
Plus d'informations se trouvent également dans PEP 389 , qui est le véhicule par lequel
argparse
il a été intégré à la bibliothèque standard.la source
optparse
dans 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).@ La réponse de Nicholas couvre bien cela, je pense, mais pas la question la plus "méta" avec laquelle vous commencez:
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).
la source
parser.add_argument('--long-opt', '-l',...)
; '-' est géré facilement, et comme vous le souhaitez.La meilleure source de justification pour un ajout Python serait son PEP: PEP 389: argparse - Nouveau module d'analyse de ligne de commande , en particulier, la section intitulée Pourquoi getopt et optparse ne sont-ils pas assez?
la source
Il y a aussi de nouveaux enfants sur le bloc!
Si vous avez besoin d'une comparaison plus approfondie, veuillez lire ceci et vous pourriez finir par utiliser docopt ou cliquer . Merci à Kyle Purdon!
la source
Au début, j'étais aussi réticent que @fmark à passer de optparse à argparse, car:
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.
la source