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

Popular posts from this blog

Are Regular VACUUM ANALYZE Still Recommended Under 9.1?

Can Feynman Diagrams Be Used To Represent Any Perturbation Theory?