Der Titel fasst ziemlich genau zusammen, was ich gerne gemacht hätte.
Folgendes habe ich, und obwohl das Programm keine nicht positive Ganzzahl in die Luft jagt, möchte ich, dass der Benutzer darüber informiert wird, dass eine nicht positive Ganzzahl im Grunde genommen Unsinn ist.
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-g", "--games", type=int, default=162,
help="The number of games to simulate")
args = parser.parse_args()
Und die Ausgabe:
python simulate_many.py -g 20
Setting up...
Playing games...
....................
Ausgabe mit einem Negativ:
python simulate_many.py -g -2
Setting up...
Playing games...
Jetzt könnte ich natürlich nur ein Wenn hinzufügen, um festzustellen if args.games
, ob es negativ ist, aber ich war neugierig, ob es eine Möglichkeit gibt, es auf der argparse
Ebene abzufangen, um den automatischen Verwendungsdruck zu nutzen.
Im Idealfall würde es etwas Ähnliches drucken:
python simulate_many.py -g a
usage: simulate_many.py [-h] [-g GAMES] [-d] [-l LEAGUE]
simulate_many.py: error: argument -g/--games: invalid int value: 'a'
Wie so:
python simulate_many.py -g -2
usage: simulate_many.py [-h] [-g GAMES] [-d] [-l LEAGUE]
simulate_many.py: error: argument -g/--games: invalid positive int value: '-2'
Im Moment mache ich das und ich denke, ich bin glücklich:
if args.games <= 0:
parser.print_help()
print "-g/--games: must be positive."
sys.exit(1)
int
fehlschlägt, gibt es dann immer noch eine lesbare Ausgabe? Oder sollten Sietry
raise
die Konvertierung dafür manuell durchführen?error: argument foo: invalid check_positive value: 'foo=<whatever>'
. Sie können einfach eintry:
... hinzufügenexcept ValueError:
, das eine Ausnahme mit einer besseren Fehlermeldung erneut auslöst.type
wäre die empfohlene Option, um Bedingungen / Überprüfungen zu behandeln, wie in Yuushis Antwort.In Ihrem speziellen Fall können Sie den
choices
Parameter auch verwenden , wenn Ihre Obergrenze ebenfalls bekannt ist:Hinweis: Verwenden Sie
range
anstelle vonxrange
für Python 3.x.quelle
if
ist viel schneller.xrange
) und benötigt keinen zusätzlichen Code. Dieser Kompromiss ist verfügbar. Es liegt an jedem, zu entscheiden, welchen Weg er gehen soll.Der schnelle und schmutzige Weg, wenn Sie ein vorhersehbares Maximum und ein vorhersehbares Minimum für Ihr Argument haben, ist die Verwendung
choices
mit einem Bereichquelle
Eine einfachere Alternative, insbesondere bei Unterklassen
argparse.ArgumentParser
, besteht darin, die Validierung innerhalb derparse_args
Methode zu initiieren .Innerhalb einer solchen Unterklasse:
Diese Technik ist möglicherweise nicht so cool wie eine benutzerdefinierte aufrufbare, aber sie erledigt den Job.
Über
ArgumentParser.error(message)
:Kredit: Antwort von Jonatan
quelle
print "-g/--games: must be positive."; sys.exit(1)
nur ersetzenparser.error("-g/--games: must be positive.")
. (Verwendung wie in Jonatans Antwort .)Falls jemand (wie ich) bei einer Google-Suche auf diese Frage stößt, finden Sie hier ein Beispiel für die Verwendung eines modularen Ansatzes, um das allgemeinere Problem, Argparse-Ganzzahlen nur in einem bestimmten Bereich zuzulassen, sauber zu lösen :
Dies ermöglicht Ihnen Folgendes:
Die Variable
foo
erlaubt jetzt nur positive ganze Zahlen , wie das OP gefragt.Beachten Sie, dass zusätzlich zu den oben genannten Formularen nur ein Maximum möglich ist mit
IntRange
:quelle