web-dev-qa-db-fra.com

Pourquoi utiliser argparse plutôt que optparse?

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 au lieu de optparse? Existe-t-il de nouvelles fonctionnalités que je devrais connaître?

274
fmark

À partir de python 2.7, optparse est obsolète et, espérons-le, disparaîtra dans le futur.

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

  • traitement des arguments de position
  • sous-commandes de soutien
  • permettant des préfixes d'option alternatifs comme + et /
  • gérer 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

Des informations complémentaires sont également disponibles dans PEP 389 , qui est le véhicule par lequel argparse a été intégré à la bibliothèque standard.

306
Nicholas Knight

Pourquoi devrais-je l'utiliser au lieu de optparse? Sont leurs nouvelles fonctionnalités que je devrais connaître?

La réponse de @ Nicholas couvre bien cela, je pense, mais pas la question plus méta par 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 lorsqu'un module utile est ajouté à la bibliothèque standard: que faites-vous lorsque se présente un moyen nettement meilleur, mais incompatible avec les versions antérieures, de fournir le même type de fonctionnalité?

Soit vous vous en tenez à l’ancienne méthode certes dépassée (en général, lorsque nous parlons de paquets compliqués: asyncore vs torsadé, tkinter vs wx ou Qt, ...) ou vous vous retrouvez avec plusieurs façons incompatibles de faire la même chose (XML Les analyseurs syntaxiques, à mon humble avis, en sont un exemple encore meilleur que les analyseurs syntaxiques en ligne de commande - mais le paquetage email par rapport à la myriade de manières de traiter des problèmes similaires n’est pas très loin non plus ;-).

Vous pouvez faire des reproches menaçants dans la documentation au sujet des anciennes méthodes "déconseillées", mais (tant que vous devez conserver la compatibilité ascendante), vous ne pouvez pas vraiment les supprimer sans empêcher les applications volumineuses et importantes de passer à de nouvelles Python communiqués.

(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 paquets vont mourir" ... avec des versions tous les ans et demi environ, des paquets qui ne sont pas très volumineux, très stable, pas ayant besoin de versions plus souvent que cela, peut en réalité beaucoup souffrir d'être "figé" dans la bibliothèque standard ... mais c'est vraiment un problème différent) .

60
Alex Martelli

La meilleure source de justification pour un ajout de Python serait son PEP: PEP 389: argparse - Nouveau module d’analyse de ligne de commande , dans en particulier, la section intitulée, Pourquoi getopt et optparse ne suffisent-ils pas?

34
Ned Batchelder

Il y a aussi de nouveaux enfants sur le bloc!

  • Outre les obsolètes déjà mentionnées optparse . [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 intéressante à regarder, qui utilise une chaîne de documentation comme analyseur syntaxique pour votre entrée.
  • click est également une bibliothèque externe qui utilise des décorateurs pour la définition des arguments. (Ma source recommande: Why Click )
  • python-inquirer Pour les outils ciblés sur la sélection et basés sur Inquirer.js ( repo )

Si vous avez besoin d’une comparaison plus approfondie, veuillez lire this et vous pourriez utiliser docopt ou cliquez sur . Merci à Kyle Purdon!

16
lony

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

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

Ensuite, j'ai vu ce document, argparse surpasse optparse, en particulier lorsqu'il est question 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 " de @Nicholas, disant que nous pouvons avoir argparse disponible dans python <2.7 (Oui, je ne le savais pas auparavant.)

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

4
RayLuo