Judul ini cukup meringkas apa yang saya inginkan terjadi.
Inilah yang saya miliki, dan sementara program tidak meledak pada integer nonpositif, saya ingin pengguna diberi tahu bahwa integer nonpositif pada dasarnya adalah omong kosong.
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()
Dan hasilnya:
python simulate_many.py -g 20
Setting up...
Playing games...
....................
Output dengan negatif:
python simulate_many.py -g -2
Setting up...
Playing games...
Sekarang, jelas saya bisa saja menambahkan jika untuk menentukan if args.games
adalah negatif, tetapi saya ingin tahu apakah ada cara untuk menjebaknya di argparse
tingkat, sehingga dapat mengambil keuntungan dari pencetakan penggunaan otomatis.
Idealnya, itu akan mencetak sesuatu yang mirip dengan ini:
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'
Seperti itu:
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'
Untuk saat ini saya melakukan ini, dan saya rasa saya senang:
if args.games <= 0:
parser.print_help()
print "-g/--games: must be positive."
sys.exit(1)
int
gagal, apakah masih akan ada keluaran yang dapat dibaca? Atau haruskah Andatry
raise
konversi secara manual untuk itu?error: argument foo: invalid check_positive value: 'foo=<whatever>'
. Anda bisa menambahkantry:
...except ValueError:
di sekitarnya yang memunculkan kembali pengecualian dengan pesan kesalahan yang lebih baik.type
akan menjadi opsi yang direkomendasikan untuk menangani kondisi / pemeriksaan, seperti dalam jawaban Yuushi.Dalam kasus spesifik Anda, Anda juga dapat menggunakan
choices
parameter jika batas atas Anda juga diketahui:Catatan: Gunakan
range
sebagai gantixrange
untuk python 3.xsumber
if
jauh lebih cepat.xrange
) dan tidak memerlukan kode tambahan. Pertukaran itu tersedia. Terserah masing-masing untuk memutuskan ke mana harus pergi.Cara cepat dan kotor, jika Anda memiliki maks yang dapat diprediksi dan juga min untuk arg Anda, digunakan
choices
dengan kisaransumber
Alternatif yang lebih sederhana, terutama jika subclassing
argparse.ArgumentParser
, adalah memulai validasi dari dalamparse_args
metode.Di dalam subclass seperti itu:
Teknik ini mungkin tidak sekeren pemanggil kustom, tetapi melakukan pekerjaan.
Tentang
ArgumentParser.error(message)
:Kredit: jawaban oleh jonatan
sumber
print "-g/--games: must be positive."; sys.exit(1)
dengan adilparser.error("-g/--games: must be positive.")
. (Penggunaan seperti dalam jawaban jonatan .)Jika seseorang (seperti saya) menemukan pertanyaan ini dalam pencarian Google, berikut adalah contoh bagaimana menggunakan pendekatan modular untuk dengan rapi menyelesaikan masalah yang lebih umum yaitu mengizinkan integer argparse hanya dalam rentang yang ditentukan :
Ini memungkinkan Anda melakukan sesuatu seperti:
Variabel
foo
sekarang hanya memungkinkan bilangan bulat positif , seperti yang diminta OP.Perhatikan bahwa selain bentuk-bentuk di atas, maksimum juga dimungkinkan dengan
IntRange
:sumber