Bagaimana kalau menggunakan parser.parse_known_args()metode dan kemudian menambahkan --lportdan --rportargs sebagai diperlukan args jika --proxada.
# 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 optsdihasilkan 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
--proxtidak ada, dua opsi dependen lainnya bahkan tidak ada di namespace. Meskipun berdasarkan kasus penggunaan Anda, jika --proxtidak ada, apa yang terjadi pada opsi lain tidak relevan.
- Perlu mengubah pesan penggunaan karena parser tidak mengetahui struktur lengkapnya
--lportdan --rporttidak muncul di pesan bantuan