web-dev-qa-db-fra.com

Comment créer une valeur optionnelle pour l'argument en utilisant argparse?

Je crée un script python où je veux avoir un argument qui manipule le nombre de résultats de recherche que vous obtenez en sortie. J'ai actuellement nommé l'argument --head. Voici la fonctionnalité que j'aimerais qu'elle ait:

  1. Quand --head n'est pas passé sur la ligne de commande. Je voudrais qu'il prenne par défaut une valeur. Dans ce cas, un assez gros, comme 80

  2. Quand --head est passé sans aucune valeur, je voudrais qu'il prenne par défaut une autre valeur. Dans ce cas, quelque chose de limité, comme 10

  3. Quand --head est passé avec une valeur, j'aimerais qu'il stocke la valeur qu'il a été passée.

Voici un code décrivant le problème:

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('-h',
                        '--head',
                        dest='size',
                        const=80,
                        default=10,
                        action="I don't know",
                        help='Only print the head of the output')
>>> # OFC, that last line will fail because the action is uknown,
... # but here is how I'd like it to work
... parser.parse_args(''.split())
Namespace(size=80)
>>> parser.parse_args('--head'.split())
Namespace(size=10)
>>> parser.parse_args('--head 15'.split())
Namespace(size=15)

Je sais que je peux probablement écrire une action personnalisée pour cela, mais je veux d'abord voir s'il y a un comportement par défaut qui fait cela.

39
totokaka

Après un peu plus de lecture dans la documentation, j'ai trouvé ce dont j'avais besoin: nargs='?'. Ceci est utilisé avec l'action store et fait exactement ce que je veux.

Voici un exemple:

>>> import argparse
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--head',
                        dest='size',
                        const=10,
                        default=80,
                        action='store',
                        nargs='?',
                        type=int,
                        help='Only print the head of the output')
>>> parser.parse_args(''.split())
... Namespace(size=80)
>>> parser.parse_args('--head'.split())
... Namespace(size=10)
>>> parser.parse_args('--head 15'.split())
... Namespace(size=15)

Source: http://docs.python.org/3/library/argparse.html#nargs

55
totokaka