2016-02-23 1 views
2
import argparse 

parser_sub = subparsers.add_parser('files') 
parser_sub.add_argument(
'--file-name', 
action='store', 
dest='filename', 
nargs='*') 

options = parser.parse_args() 

Sortie: erreur: trop peu d'arguments.Comment est-ce que je peux définir un subparser à optionnel dans argparse?

Selon ce lien: https://bugs.python.org/issue9253 il indique que les sous-parties ne peuvent pas être optionnelles. Ce comportement peut-il être changé? Je voudrais que mes sous-commandes soient optionnelles. Comment puis-je y parvenir via argparse en python 2.6?

Répondre

2

Il n'y a pas grand-chose à ajouter à ce bogue/problème https://bugs.python.org/issue9253.

subparsers est un type particulier d'argument positionnel. Normalement, la seule façon de faire une positionnelle optionnelle est avec le paramètre nargs='?'.

Comme détaillé dans le problème de bogue, dans les versions récentes, les sous-composants ont été rendus facultatifs par inadvertance. C'est le résultat d'un changement dans la façon dont l'analyseur vérifie les arguments requis.

Je ne dirai pas qu'il est impossible de modifier ce comportement dans la version 2.6, mais ce n'est pas quelque chose que vous pouvez faire avec juste une ou deux valeurs de paramètre. Je pense que cela nécessiterait une bonne compréhension de ce bug/problème. Il faut soit un changement de code à parse_args, ou peut-être une classe d'action subparser personnalisée.


Dans les versions antérieures, une chaîne de subparser manquante sera pris par:

# if we didn't use all the Positional objects, there were too few 
    # arg strings supplied. 
    if positionals: 
     self.error(_('too few arguments')) 

positionals est une liste d'actions de position. Lorsqu'un positionnel est traité, il est supprimé de cette liste. Les actions avec ? et '*' sont traitées même s'il n'y a pas de chaîne (puisque les listes acceptent les listes vides). Donc tout ce qui reste dans positionals n'a pas été vu.

Les versions plus récentes ont abandonné ce test, en substituant à la place un test sur l'attribut required (qui était déjà utilisé pour tester optionals).

+0

Pouvez-vous s'il vous plaît aider ici pour expliquer comment utiliser « nargs » pour que paramètre optionnel – AlokThakur

+0

https://docs.python.org/3/library/argparse.html#nargs – hpaulj

+0

Je dois ajouter que 'add_subparsers' produit une argument avec une valeur spéciale 'nargs = 'A ...''. Cela ne peut pas être changé sans détruire le mécanisme du sous-registre. – hpaulj