Saya memiliki persyaratan sebagai berikut:
./xyifier --prox --lport lport --rport rport
untuk argumen prox, saya menggunakan action = 'store_true' untuk memeriksa apakah ada atau tidak. Saya tidak membutuhkan argumen apapun. Tapi, jika --prox di set, saya membutuhkan rport dan lport juga. Apakah ada cara mudah untuk melakukan ini dengan argparse tanpa menulis pengkodean bersyarat khusus.
Kode Lainnya:
non_int.add_argument('--prox', action='store_true', help='Flag to turn on proxy')
non_int.add_argument('--lport', type=int, help='Listen Port.')
non_int.add_argument('--rport', type=int, help='Proxy port.')
Jawaban:
Tidak, tidak ada opsi di argparse untuk membuat kumpulan opsi yang saling inklusif .
Cara termudah untuk mengatasinya adalah:
sumber
parser.error
metodenya, inilah yang saya cari!if args.prox and (args.lport is None or args.rport is None):
args.lport is None
, Anda cukup menggunakannot args.lport
. Saya pikir itu sedikit lebih pythonic.--lport
atau--rport
ke0
, yang mungkin merupakan masukan yang valid untuk program.Anda sedang berbicara tentang memiliki argumen yang diwajibkan secara bersyarat. Seperti yang dikatakan @borntyping, Anda dapat memeriksa kesalahan dan melakukan
parser.error()
, atau Anda dapat menerapkan persyaratan yang terkait dengan--prox
saat Anda menambahkan argumen baru.Solusi sederhana untuk contoh Anda adalah:
Cara ini
required
menerima salah satuTrue
atauFalse
tergantung pada apakah pengguna digunakan--prox
. Ini juga menjamin-lport
dan-rport
memiliki perilaku independen antara satu sama lain.sumber
ArgumentParser
dapat digunakan untuk mengurai argumen dari daftar selainsys.argv
, dalam hal ini akan gagal.--prox=<value>
sintaks digunakan.Bagaimana kalau menggunakan
parser.parse_known_args()
metode dan kemudian menambahkan--lport
dan--rport
args sebagai diperlukan args jika--prox
ada.Juga perlu diingat bahwa Anda dapat menyediakan namespace yang
opts
dihasilkan setelah penguraian pertama sambil mengurai argumen yang tersisa untuk kedua kalinya. Dengan begitu, pada akhirnya, setelah semua penguraian selesai, Anda akan memiliki satu namespace dengan semua opsi.Kekurangan:
--prox
tidak ada, dua opsi dependen lainnya bahkan tidak ada di namespace. Meskipun berdasarkan kasus penggunaan Anda, jika--prox
tidak ada, apa yang terjadi pada opsi lain tidak relevan.--lport
dan--rport
tidak muncul di pesan bantuansumber
Apakah Anda menggunakan
lport
saatprox
tidak diatur. Jika tidak, mengapa tidak membuatlport
danrport
memperdebatkanprox
? misalnyaPengguna Anda tidak perlu mengetik. Hal ini hanya sebagai mudah untuk tes
if args.prox is not None:
sebagaiif args.prox:
.sumber
a,b = args.prox
,a = args.prox[0]
, dllJawaban yang diterima bekerja dengan baik untuk saya! Karena semua kode rusak tanpa tes, inilah cara saya menguji jawaban yang diterima.
parser.error()
tidak menimbulkanargparse.ArgumentError
kesalahan melainkan keluar dari proses. Anda harus mengujinyaSystemExit
.dengan pytest
dengan unittests
terinspirasi dari: Menggunakan unittest untuk menguji argparse - kesalahan keluar
sumber