TL;DR
If you want to set a parameter’s default value to True using argparse, use
parser.add_argument('--param', action='store_false')
Otherwise, use
parser.add_argument('--param', action='store_true')
when we use
argparse to
manager program parameters and add a parameter, we often use the
action options to
set the parameter’s value to a boolean value. But I have previously
misunderstood this options and made a mistake. In this post, I will explain how
does this option work and how to use it correctly.
Typically we use action='store_true' or action='store_false' to set the
parameter to boolean value. Previously, I thought that action='store_true'
will set the parameter value to True and action='store_false' will set the
parameter value to False. In fact, it is not true. Suppose we have a script
toy_parser.py:
import argparase
parser = argparse.ArgumentParser(description="A toy argument parser")
parser.add_argument('--param1', action='store_true')
parser.add_argument('--param2', action='store_false')
args = parser.parse_args()
print(args)
If we run this script on the command line with no argument
python toy_parser.py
the output will be:
Namespace(param1=False, param2=True)
The result is exactly contratry to what we thought.
What about run the script with parameters?
$ python toy_parser.py –param1 –param2 Namespace(param1=True, param2=False)
$ python toy_parser.py –param1 Namespace(param1=True, param2=True)
$ python toy_parser.py –param2 Namespace(param1=False, param2=False)
In summary, if a parameter has action store_true but is missing in the
command line, the default value will be False, otherwise, the value will be
True. Similarly, if a parameter has action store_false but is missing in
the command line, the default value will be True, otherwise, the value will
be False.
The following two statements are problematic:
parser.add_argument('--param1', action='store_true', default=True)
parser.add_argument('--param2', action='store_false', default=False)
Wheter you use these paramters on the command line, they will always be True
or False, which is not what we want.