我想做这样的事情
allowed_args = ['--email', '--password', '--verbose']
if '--email' in allowed_args:
parser.add_argument('--email')
if '--password' in allowed_args:
parser.add_argument('--password', help='Better dont use your password on command line')
if '--verbose' in allowed_args:
parser.add_argument('--verbose', action='store_true')
因为我需要定义,哪些参数是允许的,然后再使用 argparse
.
这和expeted的工作原理一样,但我如何避免使用这些重复的if子句(这只是一个例子,实际上我有更多的例子...)?我想以某种方式预先定义参数,然后选择使用其中的哪个参数。
这是一个有点棘手的问题。
allowed_args = {
'--email':{},
'--password':{'help':'Better dont ...',}, # you can add more items
'--verbose':{'action':'store_true',}
}
那么
for k,v in allowed_args.items():
parser.add_argument(k, **v)
你可以添加尽可能多的参数到你的 allowed_args
值(the dict inside
).
你可以定义一个args和kwargs的字典,以便在发生匹配时传递。
parameters = {
"--email": {
"args": [],
"kwargs": {},
},
"--password": {
"args": [],
"kwargs": {
"help": "Better dont use your password on command line"
},
},
"--verbose": {
"args": [],
"kwargs": {
"action": "store_true"
}
}
}
然后,你可以遍历你的输入数组并在循环中添加参数。
allowed_args = ['--email', '--password', '--verbose']
for arg in allowed_rags:
arg_parameters = parameters[arg]
parser.add_argument(arg, *arg_parameters['args'], **arg_parameters['kwargs'])
你也可以检查给定的参数是否存在并引发异常。
allowed_args = ['--email', '--password', '--verbose']
for arg in allowed_rags:
if arg not in parameters:
raise NotImplementedError(arg)
arg_parameters = parameters[arg]
此外,如果你使用一个集合作为输入, 你可以避免一些边缘情况。
allowed_args = {'--email', '--password', '--verbose'}
for arg in allowed_args & parameters:
arg_parameters = parameters[arg]
parser.add_argument(arg, *arg_parameters['args'], **arg_parameters['kwargs'])
你可以这样写:
for name, args, kwargs in \
[('--email', [], {}),
('--password', [], {help: 'Better dont use your password on command line'}),
('--verbose', [], {action: 'store_true'})]:
parser.add_argument(name, *args, **kwargs)
映射也可以存储在一个字典中,但是通过使用一个图元组列表,这可以确保即使在旧版本的 Python 上使用,也能按照所需的顺序添加选项。