9

I'm using the argparse module to get two optional command line arguments:

parser.add_argument('start_date', nargs='?', metavar='START DATE',
                   help='start date in YYYY-MM-DD')
parser.add_argument('end_date', nargs='?', metavar='END DATE',
                   help='end date in YYYY-MM-DD')

which gives

> python test_arg.py -h
usage: test_arg.py [-h] [START DATE] [END DATE]

However I want the pair of optional arguments (START DATE and END DATE), if provided at all, to be provided together. Something like along this line:

usage: test_arg.py [-h] [START_DATE END_DATE]

Is it possible with argparse?

4

3 回答 3

12

我能想到的最接近的是:

parser=argparse.ArgumentParser()
parser.add_argument('--dates', nargs=2, metavar=('START DATE','END_DATE'),
                   help='start date and end date in YYYY-MM-DD')
print(parser.format_help())

产生

usage: stock19805170.py [-h] [--dates START DATE END_DATE]

optional arguments:
  -h, --help            show this help message and exit
  --dates START DATE END_DATE
                        start date and end date in YYYY-MM-DD

没有办法指定 - 'require these 2 arguments together'nargs=2指定 2 个参数,但不使它们成为可选(nargs=[0,2]已提出一种形式,但未纳入任何发行版)。所以--dates需要使它成为可选的。为了产生这个帮助,元变量必须是一个元组(用一个列表试试看我的意思)。这tuple metavar仅适用于optionals(不适用于位置)。

于 2013-11-06T16:40:30.067 回答
2

我认为这样做的唯一方法是自己进行检查:

if (not parser.start_date) != (not parser.end_date):
    print("Error: --start_date and --end_date must be used together.")
    arg_parser.print_usage()
    sys.exit(-1)

不幸的是,这并没有反映在帮助信息中。

于 2015-09-08T22:14:37.823 回答
0

尝试添加 default=None 作为变量

parser.add_argument('start_date', nargs='?', metavar='START DATE',
                   help='start date in YYYY-MM-DD', default=None)
parser.add_argument('end_date', nargs='?', metavar='END DATE',
                   help='end date in YYYY-MM-DD', default=None)

我认为这应该有效。

于 2013-11-06T06:18:50.387 回答