Python 参数解析器 - 仅从控制台解析

Python argument parser - parse only from console

我可以只从命令行中提取已解析的参数,而忽略所有默认参数吗? 如果用户传递了参数的默认值,我希望它也出现在子集中:

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" --b "b"

我想要

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

    from_cli = parse_from_cli(parser) # from_cli = {'a':'e','b':'b'}

您可以省略 add_argument 函数的 default= 参数,然后用户未明确指定的参数将解析为 None.

您可以为 parse_args 提供 namespace argument. In this case,所提供命名空间中的值将优先于解析器中设置的默认值。我们只需要创建一个“掩码”命名空间和一个哨兵对象来覆盖默认值。似乎没有 public 从解析器中提取参数的方法,但我们可以调用解析器两次并使用第一次调用来创建掩码。

import argparse

NOTHING = object()

parser = argparse.ArgumentParser()
parser.add_argument('--foo', default=1, type=int)
parser.add_argument('--bar', default=2, type=int)

args = vars(parser.parse_args())
mask = argparse.Namespace(**{arg: NOTHING for arg in args})

masked_namespace = parser.parse_args(namespace=mask)
masked_args = {
    arg: value
    for arg, value in vars(masked_namespace).items()
    if value is not NOTHING
}

print(masked_args)

在使用中你会得到:

$ python foo.py
{}
$ python foo.py --bar 11
{'bar': 11}

您可以将旧参数保存在单独的配置文件中,然后读取并写回更改后的参数。

这应该看起来像这样:

import argparse

args = {'a':None,'b':None}

with open("config","r") as config:

    parser = argparse.ArgumentParser()
    parser.add_argument("--a",type=str)
    parser.add_argument("--b",type=str)

    newargs = parser.parse_args()


    # set new arguments
    args['a'] = newargs.a
    args['b'] = newargs.b

    # read previous arguments
    for line in config.readlines():
        if ":" in line : 
            temp = line.strip().split(":")
            if not args[temp[0]] :
                args[temp[0]] = temp[1]

with open("config","w") as config:

    # write back new arguments with the newargs
    lines = []
    for key in args.keys() :
        lines.append("{}:{}\n".format(key,args[key]))

    config.writelines(lines)

print(args)

配置文件中的编码当然可以不同,我选择这个是为了调试。