Bagaimana kalau menggunakan parser.parse_known_args()
metode dan kemudian menambahkan --lport
dan --rport
args sebagai diperlukan args jika --prox
ada.
# just add --prox arg now
non_int = argparse.ArgumentParser(description="stackoverflow question",
usage="%(prog)s [-h] [--prox --lport port --rport port]")
non_int.add_argument('--prox', action='store_true',
help='Flag to turn on proxy, requires additional args lport and rport')
opts, rem_args = non_int.parse_known_args()
if opts.prox:
non_int.add_argument('--lport', required=True, type=int, help='Listen Port.')
non_int.add_argument('--rport', required=True, type=int, help='Proxy port.')
# use options and namespace from first parsing
non_int.parse_args(rem_args, namespace = opts)
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:
- Jika
--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.
- Perlu mengubah pesan penggunaan karena parser tidak mengetahui struktur lengkapnya
--lport
dan --rport
tidak muncul di pesan bantuan