Argparse: Required argument “y” if “x” is present

StackOverflow

I have a requirement as follows:

./xyifier --prox --lport lport --rport rport

for the argument prox , I use action="store_true" to check if it is present or not. I do not require any of the arguments. But, if --prox is set I require rport and lport as well. Is there an easy way of doing this with argparse without writing custom conditional coding.

More Code:

non_int.add_argument("--prox", action="store_true", help="Flag to turn on proxy")
non_int.add_argument("--lport", type=int, help="Listen Port.")
non_int.add_argument("--rport", type=int, help="Proxy port.")

Answer rating: 144

No, there isn"t any option in argparse to make mutually inclusive sets of options.

The simplest way to deal with this would be:

if args.prox and (args.lport is None or args.rport is None):
    parser.error("--prox requires --lport and --rport.")

Answer rating: 63

You"re talking about having conditionally required arguments. Like @borntyping said you could check for the error and do parser.error(), or you could just apply a requirement related to --prox when you add a new argument.

A simple solution for your example could be:

non_int.add_argument("--prox", action="store_true", help="Flag to turn on proxy")
non_int.add_argument("--lport", required="--prox" in sys.argv, type=int)
non_int.add_argument("--rport", required="--prox" in sys.argv, type=int)

This way required receives either True or False depending on whether the user as used --prox. This also guarantees that -lport and -rport have an independent behavior between each other.





Get Solution for free from DataCamp guru