如何解决Python 参数解析器 - 仅从控制台解析
我可以只从命令行提取解析的参数,而忽略所有默认参数吗? 如果用户传递了参数的默认值,我希望它也出现在子集中:
parser = argparse.ArgumentParser()
parser.add_argument("--a",type=str,default='a')
parser.add_argument("--b",default='b')
parser.add_argument("--c",default='c')
parser.add_argument("--d",default='d')
python run.py --a "e" --b "b"
我想要
def main():
parser = argparse.ArgumentParser()
parser.add_argument("--a",default='a')
parser.add_argument("--b",default='b')
parser.add_argument("--c",default='c')
parser.add_argument("--d",default='d')
from_cli = parse_from_cli(parser) # from_cli = {'a':'e','b':'b'}
解决方法
您可以为 parse_args
提供 namespace
argument。 In this case,提供的命名空间中的值将优先于解析器中设置的默认值。我们只需要创建一个“掩码”命名空间和一个哨兵对象来覆盖默认值。似乎没有从解析器中提取 args 的公共方法,但我们可以调用解析器两次并使用第一次调用来创建掩码。
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}
,
您可以省略 default=
函数的 add_argument
参数,然后用户未明确指定的参数将解析为 None
。
您可以将旧参数保存在单独的配置文件中,然后读取和写回更改后的参数。
这应该是这样的:
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)
配置文件中的编码当然可以不同,我选择这个是为了调试。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。