web-dev-qa-db-fra.com

Comment utiliser correctement les sous-analyseurs argparse?

J'ai cherché dans tous les exemples de sous-analyseurs ici et en général, mais je n'arrive pas à comprendre cette chose apparemment simple.

J'ai deux types de var dont l'un a des contraintes, donc le sous-analyseur était la voie à suivre. par exemple. -t autorise "A" ou "B". Si l'utilisateur réussit "A", il doit en outre spécifier également s'il s'agit de "a1" ou de "a2". S'ils passent juste "B" alors rien.

Puis-je faire cela et demander à argparse de me renvoyer quel type de "A" a été passé ou si c'était juste "B"?

Ce qui suit semble fonctionner, mais pour une raison quelconque, il se casse lors du passage de quoi que ce soit après la sous-analyse.

par exemple. à partir d'un terminal linux

>> python test01.py -t A a1 -v 61

erreurs avec ...

usage: test01.py a1 [-h]
test01.py a1: error: unrecognized arguments: -v

J'espère que cela a du sens.

Le code:

import argparse

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='types of A')

parser.add_argument("-t",
                    choices = ["A", "B"],
                    dest = "type",
                    required=True,
                    action='store',
                    help="Some help blah blah")

cam_parser = subparsers.add_parser('a1', help='Default')
cam_parser.set_defaults(which='a1')

cam_parser = subparsers.add_parser('a2', help='parse this instead of default')
cam_parser.set_defaults(which='a2')


parser.add_argument("-v",
                    nargs = '+',
                    required=True,
                    dest = "version",
                    type=int,
                    action='store',
                    help="some version help blah blah")   

argument = parser.parse_args()

print argument.type
print argument.version
46
user1571144

Les sous-analyseurs sont invoqués en fonction de la valeur du premier argument positional, de sorte que votre appel ressemble à

python test01.py A a1 -v 61

Le "A" déclenche le sous-analyseur approprié, qui serait défini pour permettre un argument positionnel et le -v option.

Parce que argparse n'impose pas autrement de restrictions sur l'ordre dans lequel les arguments et les options peuvent apparaître, et il n'y a pas de moyen simple de modifier quels arguments/options peut apparaître une fois que l'analyse a commencé ( quelque chose impliquant des actions personnalisées qui modifient l'instance de l'analyseur peut fonctionner), vous devriez envisager de remplacer -t lui-même:

import argparse

parser = argparse.ArgumentParser()
subparsers = parser.add_subparsers(help='types of A')
parser.add_argument("-v", ...)

a_parser = subparsers.add_parser("A")
b_parser = subparsers.add_parser("B")

a_parser.add_argument("something", choices=['a1', 'a2'])

Puisque -v est défini pour l'analyseur principal, il doit être spécifié avant l'argument qui spécifie quel sous-analyseur est utilisé pour les autres arguments.

50
chepner