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)
配置文件中的编码当然可以不同,我选择这个是为了调试。
我可以只从命令行中提取已解析的参数,而忽略所有默认参数吗? 如果用户传递了参数的默认值,我希望它也出现在子集中:
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)
配置文件中的编码当然可以不同,我选择这个是为了调试。