Que tal usar o parser.parse_known_args()
método e, em seguida, adicionar os argumentos --lport
e --rport
conforme necessário, se --prox
estiver 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)
Além disso, lembre-se de que você pode fornecer o namespace opts
gerado após a primeira análise, enquanto analisa os argumentos restantes na segunda vez. Dessa forma, no final, depois que toda a análise for feita, você terá um único namespace com todas as opções.
Desvantagens:
- Se
--prox
não estiver presente, as outras duas opções dependentes nem mesmo estão presentes no namespace. Embora com base no seu caso de uso, se --prox
não estiver presente, o que acontece com as outras opções é irrelevante.
- É necessário modificar a mensagem de uso, pois o analisador não conhece a estrutura completa
--lport
e --rport
não apareça na mensagem de ajuda