Як щодо використання parser.parse_known_args()
методу, а потім додавання --lport
та --rport
аргументи як необхідні аргументи, якщо вони --prox
є.
# 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)
Також пам’ятайте, що ви можете надати простір імен, opts
згенерований після першого розбору, під час аналізу інших аргументів вдруге. Таким чином, врешті-решт, після того, як буде проведено аналіз, у вас буде єдиний простір імен з усіма параметрами.
Недоліки:
- Якщо
--prox
немає, інших двох залежних варіантів немає навіть у просторі імен. Незважаючи на те, що виходячи з вашого використання, якщо --prox
немає, те, що відбувається з іншими варіантами, не має значення.
- Потрібно змінити повідомлення про використання, оскільки аналізатор не знає повної структури
--lport
і --rport
не відображатись у довідковому повідомленні