Le titre résume assez bien ce que j'aimerais qu'il se passe.
Voici ce que j'ai, et bien que le programme n'explose pas sur un entier non positif, je veux que l'utilisateur soit informé qu'un entier non positif est fondamentalement insensé.
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 simplement ajouter un si pour déterminer if args.games
est négatif, mais j'étais curieux de savoir s'il y avait un moyen de le piéger au argparse
niveau, afin de profiter de l'impression d'utilisation automatique.
Idéalement, il imprimerait 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'
Ainsi:
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 fais ça, et je suppose que je suis content:
if args.games <= 0:
parser.print_help()
print "-g/--games: must be positive."
sys.exit(1)
int
échoue, y aura-t-il toujours une sortie lisible? Ou devriez-vous effectuertry
raise
la conversion manuellement pour cela?error: argument foo: invalid check_positive value: 'foo=<whatever>'
. Vous pourriez simplement ajouter untry:
...except ValueError:
autour de celui-ci qui soulève à nouveau une exception avec un meilleur message d'erreur.type
serait l'option recommandée pour gérer les conditions / vérifications, comme dans la réponse de Yuushi.Dans votre cas spécifique, vous pouvez également utiliser le
choices
paramètre si votre limite supérieure est également connue:Remarque: utilisez
range
plutôt quexrange
pour python 3.xla source
if
est beaucoup plus rapide.xrange
) et ne nécessite pas de code supplémentaire. Ce compromis est disponible. A chacun de décider de la voie à suivre.Le moyen rapide et sale, si vous avez un maximum prévisible ainsi que un minimum pour votre argument, est de l'utiliser
choices
avec une plagela source
Une alternative plus simple, en particulier en cas de sous-classement
argparse.ArgumentParser
, consiste à lancer la validation depuis l'intérieur de laparse_args
méthode.À l'intérieur d'une telle sous-classe:
Cette technique n'est peut-être pas aussi cool qu'un appelable personnalisé, mais elle fait le travail.
À propos
ArgumentParser.error(message)
:Crédit: réponse de jonatan
la source
print "-g/--games: must be positive."; sys.exit(1)
par justeparser.error("-g/--games: must be positive.")
. (Utilisation comme dans la réponse de Jonatan .)Dans le cas où quelqu'un (comme moi) rencontre cette question dans une recherche Google, voici un exemple de la façon d'utiliser une approche modulaire pour résoudre proprement le problème plus général de n'autoriser les entiers argparse que dans une plage spécifiée :
Cela vous permet de faire quelque chose comme:
La variable
foo
n'autorise désormais que les entiers positifs , comme l'OP demandé.Notez qu'en plus des formulaires ci-dessus, un maximum est également possible avec
IntRange
:la source