¿Qué tal si usamos el parser.parse_known_args()método y luego agregamos los argumentos --lporty los --rportargumentos requeridos si --proxestá presente?
# 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)
También tenga en cuenta que puede proporcionar el espacio de nombres opts generado después del primer análisis mientras analiza los argumentos restantes la segunda vez. De esa manera, al final, después de que se haya realizado todo el análisis, tendrá un solo espacio de nombres con todas las opciones.
Inconvenientes:
- Si
--proxno está presente, las otras dos opciones dependientes ni siquiera están presentes en el espacio de nombres. Aunque se basa en su caso de uso, si --proxno está presente, lo que sucede con las otras opciones es irrelevante.
- Necesita modificar el mensaje de uso ya que el analizador no conoce la estructura completa
--lporty --rportno aparezcas en el mensaje de ayuda