2016-04-04 10 views
0

ArgParse von Julia ermöglicht es, für jedes Befehlszeilenargument eine Funktion zu übergeben, die überprüft, ob das übergebene Argument zulässig ist (siehe hier: http://argparsejl.readthedocs.org/en/latest/argparse.html?highlight=range_tester). Dies ist beispielsweise nützlich, um ein numerisches Argument eines übergebenen Arguments als positiv zu definieren.Äquivalent von Julias ArgParse range_teser in Pythons argparse?

Man kann dies tun, indem man die Argumente nach dem Parsen manuell prüft, aber ich denke, der range_tester Ansatz ist sauberer. Gibt es in Pythons Argarse eine äquivalente Funktionalität? Ich habe es nicht gefunden.

Antwort

3

Versuchen Sie das type Argument von add_argument. Es kann aufrufbar sein. Siehe das Beispiel für perfect_square zur Inspiration.

Das folgende Programm erstellt eine type, die einen Wert in einem bestimmten Bereich übernimmt, ohne choice mit (vielleicht gut für große Bereiche?):

import argparse 

parser = argparse.ArgumentParser() 

def int_range(start, end): 
    def range_type(arg): 
     try: 
      val = int(arg) 
     except ValueError: 
      raise argparse.ArgumentTypeError("Invalid value for range (%d, %d): %r" % (start, end, arg)) 
     if val not in range(start, end): 
      raise argparse.ArgumentTypeError("%d not in range (%d, %d)" % (val, start, end)) 
     return val 
    return range_type 

parser.add_argument('--foo', type=int_range(10, 100)) 

args = parser.parse_args() 

print("Foo is %d" % args.foo) 

Ausgang:

> python argparse_type.py --foo 0 
usage: argparse_type.py [-h] [--foo FOO] 
argparse_type.py: error: argument --foo: 0 not in range (10, 100) 
> python argparse_type.py --foo bar 
usage: argparse_type.py [-h] [--foo FOO] 
argparse_type.py: error: argument --foo: Invalid value for range (10, 100): 'bar' 
> python argparse_type.py --foo 50 
Foo is 50 

Beachten Sie, dass ein argparse.ArgumentTypeError wird ausgelöst, wenn die Konvertierung fehlschlägt. Auf diese Weise kann argparse den Hilfebildschirm und eine benutzerdefinierte Fehlermeldung anzeigen. Wenn stattdessen eine ValueError ausgelöst wird, wie durch die eingebaute int, wird stattdessen eine Standardmeldung angezeigt "ungültiger int-Wert: ...".

+0

Aktualisiert, entfernt den Hack. –