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

问题描述 投票:0回答:2

我想做这样的事情

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子句(这只是一个例子,实际上我有更多的例子...)?我想以某种方式预先定义参数,然后选择使用其中的哪个参数。

python arguments argparse
2个回答
0
投票

这是一个有点棘手的问题。

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


0
投票

你可以定义一个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'])

0
投票

你可以这样写:

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 上使用,也能按照所需的顺序添加选项。

© www.soinside.com 2019 - 2024. All rights reserved.