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