En Python, en utilisant argparse, autoriser uniquement les nombres entiers positifs
Le titre résume assez bien ce que j'aimerais voir se produire.
Voici ce que j'ai, et bien que le programme ne fait pas sauter sur un nonpositive entier, je veux que l'utilisateur soit informé que nonpositive entier est fondamentalement absurde.
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()
Et la sortie:
python simulate_many.py -g 20
Setting up...
Playing games...
....................
Sortie avec un négatif:
python simulate_many.py -g -2
Setting up...
Playing games...
Maintenant, évidemment, je pourrais juste ajouter un if pour déterminer if args.games
est négatif, mais j'étais curieux de savoir si il y avait un moyen de piéger à la argparse
niveau, afin de profiter de la correction automatique de l'utilisation de l'impression.
Idéalement, il aurait l'impression de quelque chose de similaire à ceci:
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'
Comme suit:
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'
Pour l'instant je suis en train de faire cela, et je suppose que je suis heureux:
if args.games <= 0:
parser.print_help()
print "-g/--games: must be positive."
sys.exit(1)
Vous devez vous connecter pour publier un commentaire.
Cela devrait être possible en utilisant
type
. Vous aurez toujours besoin de définir une méthode qui décide pour vous:C'est tout simplement de l'adaptation d'un exemple de la
perfect_square
fonction dans le docs surargparse
.int
échoue, va-t-il encore lisible de sortie? Ou si voustry
raise
la conversion manuellement pour qui?error: argument foo: invalid check_positive value: 'foo=<whatever>'
. Vous auriez pu tout simplement ajouter untry:
...except ValueError:
autour d'elle qui re-lève une exception avec un meilleur message d'erreur.type
serait l'option recommandée pour traiter des conditions/vérifications, comme dans Yuushi de réponse.Dans votre cas particulier, vous pouvez également utiliser le
choices
paramètre si votre limite supérieure est également connue:if
est beaucoup plus rapide.xrange
) et ne nécessite pas de code supplémentaire. Ce compromis est disponible. À chacun de décider où aller.La façon rapide et sale, si vous avez un prévisible max et min pour votre arg, c'est l'utilisation
choices
avec une gammeUne alternative plus simple, surtout si le sous-classement
argparse.ArgumentParser
, est de lancer la validation de l'intérieur de laparse_args
méthode.L'intérieur d'une telle sous-classe:
Cette technique ne peut pas être aussi cool que une coutume "callable", mais il fait le travail.
Sur
ArgumentParser.d'erreur(message)
:De crédit: réponse par jonatan
print "-g/--games: must be positive."; sys.exit(1)
avec justeparser.error("-g/--games: must be positive.")
. (Utilisation comme dans jonatan réponse.)