Search code examples
pythonargparse

Pass keyword arguments to argparse preserving defaults


Let's say you have an argument parser like below, with a usual workflow that parses CLI args via parser.parse_args().

from argparse import ArgumentParser
parser = ArgumentParser()
parser.add_argument("-arg1")
parser.add_argument("-arg2", default="some default value")

However, I also may want to bypass argument parsing and supply args directly via a dictonary, which may not contain optional arguments. All missing arguments should be supplied by the parser defaults. I.e., desirable scenario:

mydict={"arg1": "Supplied value"} # only supplied non-optional args

args = somehow_resolve_this(parser, mydict) 

# this should now work
args.arg1
# Supplied value
print(args.arg2)
# Some default value

An equivalent question would be: How can I obtain all optional argument names and default values from the parser?


Solution

  • You might convert your dict into argparse.Namespace and then feed it into .parse_args as follows

    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument("-arg1")
    parser.add_argument("-arg2", default="some default value")
    namespace = argparse.Namespace(**{"arg1":"value"})
    parsed = parser.parse_args(namespace=namespace)
    print(parsed.arg1) # value
    print(parsed.arg2) # some default value
    

    Explanation: convert dict into kwargs for argparse.Namespace using unpacking ** then feed it into parser.parse_args