Check If Argparse Optional Argument Is Set Or Not
Answer :
I think that optional arguments (specified with --
) are initialized to None
if they are not supplied. So you can test with is not None
. Try the example below:
import argparse as ap def main(): parser = ap.ArgumentParser(description="My Script") parser.add_argument("--myArg") args, leftovers = parser.parse_known_args() if args.myArg is not None: print "myArg has been set (value is %s)" % args.myArg
As @Honza notes is None
is a good test. It's the default default
, and the user can't give you a string that duplicates it.
You can specify another default='mydefaultvalue
, and test for that. But what if the user specifies that string? Does that count as setting or not?
You can also specify default=argparse.SUPPRESS
. Then if the user does not use the argument, it will not appear in the args
namespace. But testing that might be more complicated:
args.foo # raises an AttributeError hasattr(args, 'foo') # returns False getattr(args, 'foo', 'other') # returns 'other'
Internally the parser
keeps a list of seen_actions
, and uses it for 'required' and 'mutually_exclusive' testing. But it isn't available to you out side of parse_args
.
I think using the option default=argparse.SUPPRESS
makes most sense. Then, instead of checking if the argument is not None
, one checks if the argument is in
the resulting namespace.
Example:
import argparse parser = argparse.ArgumentParser() parser.add_argument("--foo", default=argparse.SUPPRESS) ns = parser.parse_args() print("Parsed arguments: {}".format(ns)) print("foo in namespace?: {}".format("foo" in ns))
Usage:
$ python argparse_test.py --foo 1 Parsed arguments: Namespace(foo='1') foo in namespace?: True
Argument is not supplied: $ python argparse_test.py Parsed arguments: Namespace() foo in namespace?: False
Comments
Post a Comment