Как об использовании 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
не отображаются в справочном сообщении