argparse: fix inconsistency in `add_argument()` API when using positional argument with `dest=` parameter
Personne n'a encore pris cette issue.
- Langage dominant
- Python
- Étoiles
- 77.2k
- Forks
- 35.9k
- Métriques de merge des PR
- Métriques de PR en attente
Description
Feature or enhancement
Proposal:
Current behaviour is ugly and inconsistent between options and positional arguments:
parser.add_argument("--option-foo", dest="my_foo_option_var")
parser.add_argument(metavar="BAR_ARG", dest="my_bar_arg_var")
# or even worse
parser.add_argument("my_bar_arg_var", metavar="BAR_ARG")
Proposed change streamlines the library API
parser.add_argument("--option-foo", dest="my_foo_option_var")
parser.add_argument("BAR_ARG", dest="my_bar_arg_var")
I think a small patch could fix this without breaking any existing code.
--- a/Lib/argparse.py
+++ b/Lib/argparse.py
@@ -1423,7 +1423,7 @@
# =======================
def add_argument(self, *args, **kwargs):
"""
- add_argument(dest, ..., name=value, ...)
+ add_argument(arg, ..., name=value, ...)
add_argument(option_string, option_string, ..., name=value, ...)
"""
@@ -1433,7 +1433,11 @@
chars = self.prefix_chars
if not args or len(args) == 1 and args[0][0] not in chars:
if args and 'dest' in kwargs:
- raise ValueError('dest supplied twice for positional argument')
+ if 'metavar' not in kwargs:
+ kwargs['metavar'] = args[0]
+ else:
+ raise ValueError('`arg` supplied with both `dest` and `metavar` for positional argument')
+ args = (kwargs.pop('dest'), )
kwargs = self._get_positional_kwargs(*args, **kwargs)
# otherwise, we're adding an optional argument
Has this already been discussed elsewhere?
This is a minor feature, which does not need previous discussion elsewhere
Links to previous discussion of this feature:
No response
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Commencez dans Lib/argparse.py au point d’entrée add_argument et examinez la gestion actuelle des arguments positionnels par rapport à la proposition. Vérifiez les tests argparse existants et confirmez que le nouveau comportement de dest et metavar pour les arguments positionnels fonctionne, tout en maintenant la compatibilité des formes existantes.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- python
- Domaine
- cli
- Type d'issue
- Fonctionnalité
- Difficulté
- 3/5
- Temps estimé
- 1-2 jours
- Activité
- À l'abandon
- Clarté
- Plutôt claire
- Accessibilité débutants
- 35/100