I would like to have a optional argument that will default to a value if only the flag is present with no value specified, but store a user-specified value instead of the default if the user specifies a value. Is there already an action available for this?
An example:
python script.py --example
# args.example would equal a default value of 1
python script.py --example 2
# args.example would equal a default value of 2I can create an action, but wanted to see if there was an existing way to do this.
2 Answers
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--example', nargs='?', const=1, type=int)
args = parser.parse_args()
print(args)% test.py
Namespace(example=None)
% test.py --example
Namespace(example=1)
% test.py --example 2
Namespace(example=2)nargs='?'means 0-or-1 argumentsconst=1sets the default when there are 0 argumentstype=intconverts the argument to int
If you want test.py to set example to 1 even if no --example is specified, then include default=1. That is, with
parser.add_argument('--example', nargs='?', const=1, type=int, default=1)then
% test.py
Namespace(example=1) 1 The difference between:
parser.add_argument("--debug", help="Debug", nargs='?', type=int, const=1, default=7)and
parser.add_argument("--debug", help="Debug", nargs='?', type=int, const=1)is thus:
myscript.py => debug is 7 (from default) in the first case and "None" in the second
myscript.py --debug => debug is 1 in each case
myscript.py --debug 2 => debug is 2 in each case