Python 如何使用列表中的函数参数进行函数调用

Python 如何使用列表中的函数参数进行函数调用,python,arguments,argparse,Python,Arguments,Argparse,我想做这样的事情 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 lin

我想做这样的事情

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',}
}
然后:


您可以向
允许的参数值(
内的dict
)添加多达个参数。

您可以这样编写:

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上使用,也可以确保以所需的顺序添加选项。

您可以定义一个args和kwargs字典,以便在匹配时传递:

参数={
“--电子邮件”:{
“args”:[],
“kwargs”:{},
},
“--密码”:{
“args”:[],
“kwargs”:{
“帮助”:“最好不要在命令行上使用密码”
},
},
“--冗长”:{
“args”:[],
“kwargs”:{
“操作”:“存储为真”
}
}
}
然后,您可以迭代输入数组并在循环中添加参数:

allowed_args=['--email','--password','--verbose']
对于允许的碎布中的arg:
arg_参数=参数[arg]
parser.add_参数(arg,*arg_参数['args'],**arg_参数['kwargs'])
您还可以检查给定参数是否存在并引发异常:

allowed_args=['--email','--password','--verbose']
对于允许的碎布中的arg:
如果参数中没有arg:
引发未实现错误(arg)
arg_参数=参数[arg]
此外,如果使用集合作为输入,则可以避免某些边缘情况:

allowed_args={'--email','--password','--verbose'}
对于允许参数和参数中的参数:
arg_参数=参数[arg]
parser.add_参数(arg,*arg_参数['args'],**arg_参数['kwargs'])

allowed_args的映射为什么不使用所有标志和参数作为映射,并遍历实际提供的列表来构建解析器?另外,这里要解决的问题到底是什么?我相信顺序可能很重要,因为这会影响使用
--help
向用户显示参数的顺序。对于Python的最新版本,字典保证按插入顺序生成条目(我相信它只在3.6版本中得到保证,尽管事实上3.5实现碰巧是按顺序进行的)。但是,为了与旧版本兼容,您可能希望使用2元组列表或OrderedDict。是的@alaniwi,您是100%正确的。谢谢你的评论。
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)