DsCpp
DsCpp

Reputation: 2489

python get changed (non-default) cli arguments?

Given an argument parser with n arguments, where I change the default value of only a small subset every run from the command line, is there a clean way of extracting a dict/namespace of all the non-default k,v arguments?

parser = argparse.ArgumentParser()
parser.add_argument("--a",type=str,default='a')
parser.add_argument("--b",type=str,default='b')
parser.add_argument("--c",type=str,default='c')
parser.add_argument("--d",type=str,default='d')

And

python run.py --a "e"

I would like to have

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--a",type=str,default='a')
    parser.add_argument("--b",type=str,default='b')
    parser.add_argument("--c",type=str,default='c')
    parser.add_argument("--d",type=str,default='d')

    non_default = parse_non_default(parser) # non_default = {'a':'e'}

Upvotes: 0

Views: 176

Answers (1)

Maurice Meyer
Maurice Meyer

Reputation: 18126

You could lookup the parser and compare which values differenciate:

import argparse


def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("--a", type=str, default='a')
    parser.add_argument("--b", type=str, default='b')
    parser.add_argument("--c", type=str, default='c')
    parser.add_argument("--d", type=str, default='d')
    parser.add_argument("--n", type=int, default=999)

    args = parser.parse_args(['--a', 'e'])  # Test CLI arguments!
    non_default = {
        opt.dest: getattr(args, opt.dest)
        for opt in parser._option_string_actions.values()
        if hasattr(args, opt.dest) and opt.default != getattr(args, opt.dest)
    }
    print(non_default)


main()

Out:

{'a': 'e'}

Upvotes: 1

Related Questions