2011-12-24 13 views
14

Il titolo dice praticamente tutto. Se ho nargs maggiore di 1, c'è un modo in cui posso impostare restrizioni (come scelta/tipo) sui singoli argomenti analizzati?Python tipo argparse e la scelta restrizioni nargs> 1

Questo è un esempio di codice:

parser = argparse.ArgumentParser() 
parser.add_argument('-c', '--credits', nargs=2, 
    help='number of credits required for a subject') 

Per l'argomento -c devo specificare un soggetto e quanti crediti sono obbligatori. L'argomento dovrebbe essere limitato a un elenco predefinito di argomenti e il numero di crediti richiesti dovrebbe essere un float.

probabilmente potrei fare questo con un subparser, ma come è questo è già parte di una sotto-comando in modo non voglio davvero le cose per ottenere più complicata.

risposta

16

È possibile convalidare con un custom action:

import argparse 
import collections 


class ValidateCredits(argparse.Action): 
    def __call__(self, parser, args, values, option_string=None): 
     # print '{n} {v} {o}'.format(n=args, v=values, o=option_string) 
     valid_subjects = ('foo', 'bar') 
     subject, credits = values 
     if subject not in valid_subjects: 
      raise ValueError('invalid subject {s!r}'.format(s=subject)) 
     credits = float(credits) 
     Credits = collections.namedtuple('Credits', 'subject required') 
     setattr(args, self.dest, Credits(subject, credits)) 

parser = argparse.ArgumentParser() 
parser.add_argument('-c', '--credits', nargs=2, action=ValidateCredits, 
        help='subject followed by number of credits required', 
        metavar=('SUBJECT', 'CREDITS') 
        ) 
args = parser.parse_args() 
print(args) 
print(args.credits.subject) 
print(args.credits.required) 

Per esempio,

% test.py -c foo 2 
Namespace(credits=Credits(subject='foo', required=2.0)) 
foo 
2.0 
% test.py -c baz 2 
ValueError: invalid subject 'baz' 
% test.py -c foo bar 
ValueError: could not convert string to float: bar 
+0

+1 Nizza, mi chiedevo se questo dovrebbe funzionare. –

+0

Alla fine sono riuscito a implementare questo, e l'uomo la tua soluzione è buona. Vorrei poterti dare più voti! Grazie! –

+2

Nota per i posteri: l'aggiunta di 'metavar = ("soggetto", "crediti")' per il 'add_argument' chiamata farà l'aiuto spettacolo' --credits OGGETTO CREDITS' piuttosto che 'CREDITI --credits CREDITS'. – Dougal

-2

suppongo che si potrebbe provare questo - in add_argument(), è possibile specificare un insieme limitato di ingressi con scelta = 'xyz' o scelta = [questo, che] come descritto qui: http://docs.python.org/library/argparse.html#choices

.210
parser = argparse.ArgumentParser() 
parser.add_argument('-c', '--credits', choice='abcde', nargs=2, 
    help='number of credits required for a subject') 
Problemi correlati