Як щодо використання 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не відображатись у довідковому повідомленні