2010-07-13 17 views
1

J'ai actuellement le code suivant:choix des réglages séparés pour deux arguments à l'aide de valeurs argparse en Python

import argparse 

parser = argparse.ArgumentParser(description='Adds a new modem to Iridium account') 
parser.add_argument('imei', metavar='I', nargs=1, help='the modems IMEI') 
parser.add_argument('-t1', '--type1', metavar='t1', nargs=1, choices=('email', 'directip', 'sbddevice'), default='directip', help='Call type (default: directip)') 
parser.add_argument('-a1', '--address1', metavar='a1', nargs=1, default='75.101.138.217:9097', help='Call address (default: 75.101.138.217:9097)') 
parser.add_argument('-t2', '--type2', metavar='t2', nargs=1, choices=('email', 'directip', 'sbddevice'), help='Call type') 
parser.add_argument('-a2', '--address2', metavar='a2', nargs=1, help='Call address') 
parser.add_argument('-t3', '--type3', metavar='t3', nargs=1, choices=('email', 'directip', 'sbddevice'), help='Call type') 
parser.add_argument('-a3', '--address3', metavar='a3', nargs=1, help='Call address') 
parser.add_argument('-t4', '--type4', metavar='t4', nargs=1, choices=('email', 'directip', 'sbddevice'), help='Call type') 
parser.add_argument('-a4', '--address4', metavar='a4', nargs=1, help='Call address') 
parser.add_argument('-t5', '--type5', metavar='t5', nargs=1, choices=('email', 'directip', 'sbddevice'), help='Call type') 
parser.add_argument('-a5', '--address5', metavar='a5', nargs=1, help='Call address') 

args = parser.parse_args() 

Est-il possible que je peux combiner toutes les -a -t et en dire -m1, -m2 , -m3, -m4, -m5 où t est la première valeur de l'argument dont les mêmes choix ci-dessous et -a est le deuxième argument mais pas limité aux mêmes choix que la première valeur? Il semble que vous devriez être capable de faire cela, sinon vous devrez faire un tas de vérifications plus tard pour voir s'il y a un t1 et un a1 puisque si l'utilisateur en fournit un, il doit fournir l'autre.

Ainsi, au lieu de faire -t1 email -a1 [email protected] vous pouvez simplement faire -m1 email [email protected]

+2

Qu'en est-il un simple 'email -m1: Test @ gmail.com' à la place ? Je ne connais pas encore assez bien l'argument "argparse" pour dire combien il est facile (si possible) de faire avaler deux args pour une seule option, mais en tant qu'utilisateur, je serais étonné d'un tel comportement d'analyse bizarre, alors que 'type: wh @ tever' me semble parfaitement naturel. –

+0

Aussi la restriction à l'exactitude de cinq adresses semble un peu arbitraire. Peut-être que vous voulez juste les adresses comme arguments de position et l'IMEI comme option? – Philipp

+0

Vous pouvez le faire accepter deux args avec 'nargs = 2' et analyser la sortie après cela (Your' choices = 'ne fonctionnera pas avec ça). Mais je suppose que vous êtes allé avec la méthode '~'. – avacariu

Répondre

2

Je ne sais pas si cela aidera tout le monde sur la route, mais je fini par faire ce que suggère Alex. La seule chose est que je ai utilisé ~ au lieu de : parce que je devais gérer les adresses IP avec les ports, donc en utilisant : serait visser les choses.

0

Vieille question, mais j'apprends à ce sujet moi-même, et j'ai pensé poster une réponse. Le paramètre nargs peut prendre en charge, mais ne peut évidemment pas être combiné avec choices, car il s'appliquerait à l'adresse e-mail ainsi:

import argparse 

parser = argparse.ArgumentParser(
    description='Adds a new modem to Iridium account', 
    formatter_class=argparse.ArgumentDefaultsHelpFormatter 
) 
parser.add_argument('imei', metavar='I', help="the modem's IMEI") 
parser.add_argument('-m1', nargs=2, metavar=("type","address"), default=['directip', '75.101.138.217:9097'], help='Call setting') 
parser.add_argument('-m2', nargs=2, metavar=("type","address"), help='Call setting') 
parser.add_argument('-m3', nargs=2, metavar=("type","address"), help='Call setting') 
parser.add_argument('-m4', nargs=2, metavar=("type","address"), help='Call setting') 
parser.add_argument('-m5', nargs=2, metavar=("type","address"), help='Call setting') 

args = parser.parse_args() 

type1 = args.multi1[0] 
address1 = args.multi1[1] 
if not type1 in ['email', 'directip', 'sbddevice']: 
    args.print_help() 
    sys.exit(1) 
...