【问题标题】:grouping an unknown number of arguments with argparse使用 argparse 对未知数量的参数进行分组
【发布时间】:2016-01-22 01:51:30
【问题描述】:

我正在为需要能够接受一组或多组选项的命令行程序设计用户界面。每个组都是相同的,但需要链接在一起,如下所示:

./myprogram.py --group1 name1,name2,pathA,pathB --group2 name3,name4,pathC,pathD

这对于用户来说似乎很笨拙。我考虑过使用INI-style configparser 设置,但它也很笨重,因为除此之外我还有很多其他参数通常具有默认值,然后我失去了argparse 的所有功能处理需求、检查文件是否存在等模块。

是否有人对我如何最好地构建我的ArgumentParser 有任何想法,以便我可以让用户一起为给定组提供四个必需的输入?我没有与逗号分隔的列表结婚,这只是一个例子。如果他们可以输入某种键值对实际上会好得多,例如

./myprogram.py --group1 firstname:name1 secondname:name2 firstpath:pathA secondpath:pathB

但我知道 argparse 不支持 dict 类型,任何允许它使用的 hack 都会更不友好。

【问题讨论】:

    标签: python argparse


    【解决方案1】:

    您可以将nargs=4'append' 操作一起使用:

    import argparse
    
    parser = argparse.ArgumentParser()
    parser.add_argument('--group', nargs=4, action='append')
    
    print parser.parse_args()
    

    它会被称为:

    $ python ~/sandbox/test.py --group 1 2 3 4 --group 1 2 3 4
    Namespace(group=[['1', '2', '3', '4'], ['1', '2', '3', '4']])
    

    如果您愿意,可以从这里解析键值对。


    另一种选择是使用自定义操作进行解析——这是一个简单的操作,它接受 --group key:value key2:value2 ... --group ... 形式的参数

    import argparse
    
    class DictAction(argparse.Action):
        def __init__(self, *args, **kwargs):
            super(DictAction, self).__init__(*args, **kwargs)
            self.nargs = '*'
    
        def __call__(self, parser, namespace, values, option_string=None):
            # The default value is often set to `None` rather than an empty list.
            current_arg_vals = getattr(namespace, self.dest, []) or []
            setattr(namespace, self.dest, current_arg_vals)
            arg_vals = getattr(namespace, self.dest)
            arg_vals.append(dict(v.split(':') for v in values))
    
    parser = argparse.ArgumentParser()
    parser.add_argument('--group', action=DictAction)
    
    print parser.parse_args()
    

    这没有检查(因此如果key:value 的格式不正确,用户可能会觉得TypeErrors 很有趣),如果您想将其限制为指定的键,您还需要构建它。 ..但这些细节应该很容易添加。您还可以要求他们在 DictAction.__init__ 中使用 self.nargs = 4 提供 4 个值。

    【讨论】:

    • 我喜欢这个,我没有意识到 action=append 可以这样工作。我还是觉得key-value部分会有点难看,但是命令行输入很难入手。
    • @IanFiddes -- 我还添加了一个 key:value 解析示例。
    猜你喜欢
    • 2015-02-18
    • 2019-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    • 2015-11-08
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多