2010-11-16 4 views
22

Ich habe ein optionales Argument, das eine Liste von Argumenten selbst unterstützt.Python argparse: Gibt es eine Möglichkeit, einen Bereich in nargs anzugeben?

Ich meine, sollte es unterstützen:

  • -f 1 2
  • -f 1 2 3

aber nicht:

  • -f 1
  • -f 1 2 3 4

Gibt es eine Möglichkeit, dies innerhalb argarse zu erzwingen? Jetzt benutze ich nargs = "*" und überprüfe dann die Listenlänge.

Bearbeiten: Wie angefordert, was ich brauchte, ist in der Lage, einen Bereich von akzeptablen Anzahl von Argumenten zu definieren. Ich meine, sagte (im Beispiel) 2 oder 3 args ist richtig, aber nicht 1 oder 4 oder irgendetwas, das nicht innerhalb des Bereichs ist 2..3

+0

Ich verstehe nicht. Meinst du, dass du in der Lage sein willst, z.B. zwischen einem und zehn Argumenten? – katrielalex

+5

Könnten Sie bitte näher erläutern, was die Regeln sind? Sie möchten mindestens 2, höchstens 3 Werte? Müssen sie 1-4 sein oder können sie irgendetwas sein? – slf

Antwort

15

Sie dies mit einem custom action tun könnten:

import argparse 

def required_length(nmin,nmax): 
    class RequiredLength(argparse.Action): 
     def __call__(self, parser, args, values, option_string=None): 
      if not nmin<=len(values)<=nmax: 
       msg='argument "{f}" requires between {nmin} and {nmax} arguments'.format(
        f=self.dest,nmin=nmin,nmax=nmax) 
       raise argparse.ArgumentTypeError(msg) 
      setattr(args, self.dest, values) 
    return RequiredLength 

parser=argparse.ArgumentParser(prog='PROG') 
parser.add_argument('-f', nargs='+', action=required_length(2,3)) 

args=parser.parse_args('-f 1 2 3'.split()) 
print(args.f) 
# ['1', '2', '3'] 

try: 
    args=parser.parse_args('-f 1 2 3 4'.split()) 
    print(args) 
except argparse.ArgumentTypeError as err: 
    print(err) 
# argument "f" requires between 2 and 3 arguments 
+1

Zeitreisender hier. Gute Antwort! Du untergliederst hier jedoch "argparse.Action". Was passiert, wenn ich möchte, dass meine Aktion "append" ist? Wie kann ich diesen Code so ändern, dass ich mehrere Instanzen dieses Arguments anhängen kann und auch den angegebenen Bereichseffekt erhält? – 2rs2ts

+1

Ah, tatsächlich, deinen Code mit [dieser Antwort] zusammenführend (http://stackoverflow.com/a/5374229/691859) tat, was ich suchte. Vergesse mich nicht - es sei denn, du dachtest das Gleiche, in welchem ​​Fall, überprüfe diese Antwort. – 2rs2ts

+2

Es gibt einen vorgeschlagenen Patch http://bugs.python.org/issue11354, um einen Bereich 'nargs' hinzuzufügen, z. 'nargs = (2,3)' oder 'nargs = '{2,3}' (' re' style notation). Dieser Ansatz ist stärker, wenn andere Positionale variable "nargs" -Werte haben. Sonst funktioniert dieser Custom-Action-Ansatz gut. – hpaulj

Verwandte Themen