python / python/cpython

argparse: fix inconsistency in `add_argument()` API when using positional argument with `dest=` parameter

Aberta
#117,834 0 comentários 1 reação 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

type-feature
Linguagem predominante
Python
Estrelas
77.2k
Forks
35.9k
Métricas de merge de PRs
Métricas de PR pendentes

Descrição

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

Guia de contribuição

Abrir o guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Direção de pesquisa

Comece em Lib/argparse.py no ponto de entrada add_argument e revise o tratamento atual dos argumentos posicionais em relação à proposta. Verifique os testes existentes de argparse e confirme que o novo comportamento de dest e metavar para argumentos posicionais funciona, enquanto as formas existentes permanecem compatíveis.

Escrita pelo modelo de indexação a partir do texto da issue.

Avaliação

Stack de tecnologia
python
Domínio
cli
Tipo de issue
Funcionalidade
Dificuldade
3/5
Tempo estimado
1-2 dias
Status de atividade
Estagnada
Clareza
Razoavelmente clara
Facilidade para iniciantes
35/100

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.