2017-09-22 5 views
0

J'utilise argparse en Python 3 pour accepter les arguments de ligne de commande dans un script. Y at-il un moyen de s'assurer que si un argument spécifique est sélectionné, un autre doit être spécifié? Par exemple, si -o est spécifié, il doit également contenir -n avant ou après -o.Choisissez plusieurs arguments optionnels avec argparse en Python 3

J'ai essayé d'ajouter une condition if, comme ceci:

if (cli_args.number): 
    print ("\n--number has the value '" + str(cli_args.number) + "'\n") 
elif (cli_args.query): 
    print ("\n--query has the value '" + cli_args.query + "'\n") 
elif (cli_args.outfile): 
    if (cli_args.number): 
     print ("\n--output has the value '" + cli_args.outfile + "'\n") 
    else: 
     print ("\n--number not specified. Exit..") 
else: 
    print ("\nNo Arguments passed. Set or Use a default value...\n") 

Le résultat est que, si seulement -o est spécifié, le script sort (comme prévu), cependant, si -n est ajouté, la première condition est vrai.

$ python test.py -o output.txt 

--number not specified. Exit.. 

$ python test.py -o output.txt -n 100 

--number has the value '100' 

Comment puis-je modifier ce de telle sorte que si seulement -n est spécifié, la 1ère condition est vraie et si -o est spécifié, il faut aussi -n et exécute alors la 3ème condition? Quelque chose comme cli_args.number AND cli_args.outfile fonctionnerait? Ou y at-il une fonction intégrée dans argparse pour cela?

+1

Oui, votre 'and' fonctionnerait, vous devez vous assurer que c'était la première condition dans votre chaîne' if', sinon, prenez votre code actuel et déplacez le bloc 'outfile' vers le haut –

+1

' argparse 'n'a aucun test 'inclusif'. Les tests après l'analyse fonctionnent bien, en particulier si l'on considère que les arguments peuvent se produire dans n'importe quel ordre. 'is None' est un bon test, car la valeur par défaut' None' ne peut pas apparaître dans la ligne de commande. – hpaulj

Répondre

0
elif (cli_args.outfile): 
    if (cli_args.number): 
     print ("\n--output has the value '" + cli_args.outfile + "'\n") 

Cette branche de la logique est injoignable dans votre code comme à chaque fois cli_args.number est vrai, il aurait rempli la première condition dans votre ... si la branche d'autre.

Vous pouvez d'abord vérifier outfile and number, ou vous pouvez modifier la logique dans la première instruction si à number and not outfile.