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: ...".
Aktualisiert, entfernt den Hack. –