¿Qué tal si usamos el parser.parse_known_args()
método y luego agregamos los argumentos --lport
y los --rport
argumentos requeridos si --prox
está 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
--prox
no 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 --prox
no 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
--lport
y --rport
no aparezcas en el mensaje de ayuda