Python命令行参数检查默认值或给定

时间:2014-07-30 11:00:18

标签: python command-line-arguments argparse

这是我的代码部分:

parser = argparse.ArgumentParser()
parser.add_argument('-a', action='store', dest='xxx', default = 'ABC')
parser.add_argument('-b', action='store', dest='yyy')
parser.add_argument('-c', action='store', dest='zzz')
args = parser.parse_args()

我希望代码能够像这样工作:

如果给出b和c,请执行command2。否则,执行command1

如果给出-a参数,则添加-b或-c会引发错误

我试过这种方式:

if args.xxx and (args.yyy or args.zzz):
   parser.print_help()
   sys.exit()

但它没有奏效,因为' -a'总是有一个愚蠢的价值,我无法改变它。 我该如何解决?

2 个答案:

答案 0 :(得分:2)

这是一种方法:

# If option xxx is not the default, yyy and zzz should not be present.
if args.xxx != 'ABC' and (args.yyy or args.zzz):
   # Print help, exit.

# Options yyy and zzz should both be either present or None.
if (args.yyy is None) != (args.zzz is None):
   # Print help, exit.

# Earn our pay.
if args.yyy is None:
    command2()
else:
    command1()

您可能还会考虑usage pattern based on subcommands,如用户注释中所述。

答案 1 :(得分:1)

我会用:

parser = argparse.ArgumentParser()
parser.add_argument('-a', dest='xxx')
parser.add_argument('-b', dest='yyy')
parser.add_argument('-c', dest='zzz')
args = parser.parse_args()

if args.xxx is None:
    args.xxx = 'ABC'
else:
    if args.zzz is not None or args.yyy is not None:
        parser.error('cannot use "b" or "c" with "a"')
if args.zzz is not None and args.yyy is not None:
     command2()
else:
     command1()

测试None是测试是否给出参数的最可靠方法(尽管简单的真值测试几乎同样好)。内部parse_args会保留seen_actions的列表,但用户无法使用该列表。在http://bugs.python.org/issue11588中,提出了一个可以访问此列表的测试挂钩的提议。