带选择选项的条件argparse

时间:2019-04-09 14:45:51

标签: python conditional argparse

下面是我在模块中编写的三个参数。

parser.add_argument('--Type',type=str,choices=['a','b','c'],help='Options include: a,b,c.',required=True)

parser.add_argument('--Input',default=False,help='Generate input files',required=False)

parser.add_argument('--Directory',default=False,help='Secondary directory',required='--Input' in sys.argv)

--Type可以通过以下三个选项来实现:a,b,c。

当前,我已经设置好了,如果--Directory为true,则它要求--Input为true。

但是,我想在--Directory中添加一个附加条件,以要求--Type为=='c'。

如何更改--Directory参数中的必需选项,使其同时需要--Input和--Type =='c'?

4 个答案:

答案 0 :(得分:2)

将参数解析与您的需求分离。

parser.add_argument('--Type', choices=['a','b','c'], required=True)
parser.add_argument('--Input', action='store_true')
parser.add_argument('--Directory', action='store_true')

args = parser.parse_args()

if args.Directory and args.Type != 'c' and not args.input:
    raise argparse.ArgumentError("--Directory requires --Type c and --Input")

(请注意,action='store_true'会自动设置type=booldefault=False。)

答案 1 :(得分:1)

我不会在任何情况下都使用required参数,因为它很容易出错,而且可读性很差。只需在解析后检查参数的有效性即可。

import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('--Type', type=str, choices=['a','b','c'], help='Options include: a,b,c.', required=True)
    parser.add_argument('--Input', default=False, help='Generate input files', required=False)
    parser.add_argument('--Directory', default=False, help='Secondary directory', required=False)
    parsed_args = parser.parse_args()
    if parsed_args.Directory and not (parsed_args.Input and parsed_args.Type == 'c'):
        parser.error('option --Directory requires --Input and --Type c.')

答案 2 :(得分:0)

这不是最漂亮的,但是您可以像这样查找--Type旁边的参数,并检查它是否等于'c'

parser.add_argument('--Directory', default=False, help='secondary directory',
                    required=('--Type' in sys.argv and
                              sys.argv[sys.argv.index('--Type') + 1] == 'c')
                   )

答案 3 :(得分:0)

我认为也可以这样做

import sys

# Your past code here

args = parser.parse_args()

type = args.Type
input = args.Input
directory = args.Directory

if directory:
    if input != 'c':
        print 'error in argument'
        sys.exit(1)