258

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 2

I can create an action, but wanted to see if there was an existing way to do this.

Mr_and_Mrs_D
  • 29,590
  • 35
  • 170
  • 347
Rob
  • 6,699
  • 7
  • 34
  • 38

2 Answers2

374
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 arguments
  • const=1 sets the default when there are 0 arguments
  • type=int converts 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)
unutbu
  • 777,569
  • 165
  • 1,697
  • 1,613
  • 1
    How to do this with strings? I have a dilemma with differentiation of "" (empty string as default) and "" (empty string as entered by user). In the code for now I'm using the default and since I need to do some ops, I have something like this `self.foo = (args.bar or some_else_source).upper()`. It will break on None object AFAIUC. – 0andriy Aug 12 '19 at 14:02
61

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

David Cullen
  • 13,143
  • 4
  • 35
  • 60
Murray
  • 769
  • 5
  • 2