Tytuł właściwie podsumowuje to, co chciałbym, żeby się wydarzyło.
Oto, co mam i chociaż program nie wysadza na niepozytywną liczbę całkowitą, chcę, aby użytkownik był informowany, że niepozytywna liczba całkowita jest w zasadzie nonsensem.
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()
A wynik:
python simulate_many.py -g 20
Setting up...
Playing games...
....................
Wyjście z ujemnym:
python simulate_many.py -g -2
Setting up...
Playing games...
Oczywiście mógłbym po prostu dodać jeśli, aby określić, że if args.games
jest ujemne, ale byłem ciekawy, czy istnieje sposób, aby uwięzić to wargparse
poziomie, aby skorzystać z automatycznego drukowania użycia.
Idealnie byłoby wydrukować coś podobnego do tego:
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'
Tak jak to:
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'
Na razie to robię i chyba jestem szczęśliwy:
if args.games <= 0:
parser.print_help()
print "-g/--games: must be positive."
sys.exit(1)
int
nie powiedzie się, czy nadal będzie możliwe do odczytania dane wyjściowe? A może powinieneśtry
raise
ręcznie wykonać konwersję?error: argument foo: invalid check_positive value: 'foo=<whatever>'
. Mógłbyś po prostu dodaćtry:
...except ValueError:
wokół niego, który ponownie wywołuje wyjątek z lepszym komunikatem o błędzie.type
byłaby zalecaną opcją do obsługi warunków / kontroli, jak w odpowiedzi Yuushi.W twoim konkretnym przypadku możesz również użyć
choices
parametru, jeśli znany jest również twój górny limit:Uwaga: użyj
range
zamiastxrange
dla python 3.xźródło
if
jest znacznie szybszy.xrange
) i nie wymaga dodatkowego kodu. Ten kompromis jest dostępny. Każdy decyduje, którą drogą iść.Szybkim i brudnym sposobem, jeśli masz przewidywalne maksimum i minimum dla swojego argumentu, jest użycie
choices
zakresuźródło
Prostszą alternatywą, zwłaszcza w przypadku tworzenia podklas
argparse.ArgumentParser
, jest zainicjowanie walidacji z wnętrzaparse_args
metody.Wewnątrz takiej podklasy:
Ta technika może nie być tak fajna jak niestandardowe wywołanie, ale spełnia swoje zadanie.
O
ArgumentParser.error(message)
:Kredyt: odpowiedź jonatana
źródło
print "-g/--games: must be positive."; sys.exit(1)
justparser.error("-g/--games: must be positive.")
. (Użycie jak w odpowiedzi jonatana .)Na wypadek, gdyby ktoś (taki jak ja) napotkał to pytanie w wyszukiwarce Google, oto przykład, jak zastosować podejście modułowe, aby zgrabnie rozwiązać bardziej ogólny problem polegający na dopuszczaniu liczb całkowitych argparse tylko w określonym zakresie :
Dzięki temu możesz zrobić coś takiego:
Zmienna
foo
dopuszcza teraz tylko dodatnie liczby całkowite , tak jak zapytał OP.Zwróć uwagę, że oprócz powyższych formularzy możliwe jest również maksimum z
IntRange
:źródło