python 更改(非默认)cli 参数?

python get changed (non-default) cli arguments?

给定一个带有 n 个参数的参数解析器,其中我从命令行每隔 运行 只更改一个小子集的默认值,是否有一种干净的方法来提取 dict/namespace 所有非默认 k,v 个参数?

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')

python run.py --a "e"

我想要

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'}

您可以查找 parser 并比较哪些值不同:

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()

输出:

{'a': 'e'}