【问题标题】:How to use function arguments from list for function call如何使用列表中的函数参数进行函数调用
【发布时间】:2020-10-04 19:59:21
【问题描述】:

我想做这样的事情

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 与所有标志和参数的映射作为映射,并遍历实际提供的列表来构建解析器?另外,这里到底要解决什么问题?

标签: python arguments argparse


【解决方案1】:

这有点棘手:

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) 添加尽可能多的参数。

【讨论】:

  • 我认为顺序可能很重要,因为这会影响使用--help 向用户呈现参数的顺序。对于足够新的 Python 版本,字典保证按插入顺序产生项目(我相信它仅从 3.6 开始保证,尽管实际上 3.5 实现恰好是有序的)。但是,为了与旧版本兼容,您可能需要使用 2 元组列表或 OrderedDict。
  • 是的@alaniwi,你是 100% 正确的。感谢您的评论。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    你可以这样写:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 2011-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-21
      • 1970-01-01
      相关资源
      最近更新 更多