【问题标题】:Argparse argument with an additional value带有附加值的 argparse 参数
【发布时间】:2016-07-12 05:01:38
【问题描述】:

我创建了一个 argparse 参数,它只支持 3 种选择:

parser.add_argument('--param', default='ch1', choices=('ch1', 'ch2', 'ch3'), help='message')

但我必须添加一个新的特殊选择ch4,这将需要一个附加值。 即,我的程序应该支持这样的输入:

./prog.py --param ch1
./prog.py --param ch2 # or ch3
./prog.py --param ch4='some_additional_variable'

我怎样才能实现这一点(或一些类似的行为)?

【问题讨论】:

  • 我认为这不是“开箱即用”的。您可能需要删除choices,添加nargs=*,然后自己进行验证(在解析命令后,或在自定义type 函数或argparse.Action 中)。
  • 您希望看到什么用法和帮助?

标签: python argparse


【解决方案1】:

如果设置了ch4 参数,您可以通过requiring an additional argument 解决它

import argparse

parser = argparse.ArgumentParser(description='...')
parser.add_argument('--param', default='ch1', choices=('ch1', 'ch2', 'ch3', 'ch4'))
parser.add_argument('--setting', help="Required if param is set to ch4")

args = parser.parse_args()    
if args.param == "ch4" and not args.setting:
    parser.error("--setting is required if param is ch4")

用法:

$ python test.py --param ch1
$ python test.py --param ch2
$ python test.py --param ch3
$ python test.py --param ch4
usage: test.py [-h] [--param {ch1,ch2,ch3,ch4}] [--setting SETTING]
test.py: error: --setting is required if param is ch
$ python test.py --param ch4 --setting "some_value"
$

【讨论】:

    【解决方案2】:

    add_argument 方法采用type 关键字参数。任何可调用对象都可以作为此参数的参数传递。
    这是一个可以传递给add_argument 方法的类,这可能满足您的要求。

    import argparse
    
    class Arg(object):
        def __init__(self, value):
            self.value = value
            if '=' in value:
                self.value = value.split('=', 1)
    
        def __str__(self):
            return '{}=<{}>'.format(self.value[0], self.value[1]) if isinstance(self.value, list) else self.value
    
        def __repr__(self):
            if isinstance(self.value, list):
                return repr('{}=<value>'.format(self.value[0]))
            return '{}'.format(repr(self.value))
    
        def __eq__(self, value):
            return '{}'.format(repr(value)) == repr(self)
    
    parser = argparse.ArgumentParser()
    parser.add_argument('--param', default='ch1', choices=('ch1', 'ch2', 'ch3', 'ch4=<value>'), type=Arg)
    
    args = parser.parse_args('--param ch4=123'.split())
    print('choice {}, value {}'.format(args.param, repr(args.param.value)))
    
    args = parser.parse_args([])
    print('choice {}, value {}'.format(args.param, repr(args.param.value)))
    
    args = parser.parse_args('--param ch3'.split())
    print('choice {}, value {}'.format(args.param, repr(args.param.value)))
    

    输出;

    choice ch4=<123>, value ['ch4', '123']
    choice ch1, value 'ch1'
    choice ch3, value 'ch3'
    

    args.paramArg 的一个实例。 args.param.value 要么是 str,要么是 list,如果选择是 ch4='some_value'

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      • 1970-01-01
      • 2020-11-29
      • 2017-10-10
      • 2018-08-11
      • 1970-01-01
      相关资源
      最近更新 更多