如何在Python的argparse中相互排除多个参数

时间:2018-04-05 18:58:28

标签: python argparse

我已阅读了不少教程,问题和文档,但无法弄清楚如何实现这一目标:

prog.py [-h] [-d DEVICE -l | (-m M -s S -p P)]

使用-l参数时,prog.py从设备接口读取。当提供-m,-s和/或-p时,prog.py会写入该接口。同时不可能进行读写,因此读写参数是相互排斥的。

一旦指定了DEVICE,就需要提供-l或-m,-s或-p中的至少一个,也应该可以提供这三者的任意组合。

到目前为止,我从各个角度解决了这个问题:

  • 我尝试了互不相同的群体,这些群体不起作用,因为只有一个论点可以相互排斥(如果我错了,请纠正我)
  • 我尝试设置子解析器,但我失败了......

这是我上次尝试的内容:

import argparse
import sys

parser = argparse.ArgumentParser()
parser.add_argument("-d","--device",
        default="system",
        help="foo")

subparsers = parser.add_subparsers(help='foo')

read_parser = subparsers.add_parser('read', help='foo')
read_parser.add_argument("-l", "--list",
        action="store_true")

write_parser = subparsers.add_parser("write", help="bar")
write_parser.add_argument("-m","--mode",
        type=str,
        choices=["on","off","auto"],
        help="foo")
write_parser.add_argument("-s", "--season",
        type=str,
        choices=["winter","summer"],
        help="foo")
write_parser.add_argument("-p","--present",
        type=int,
        choices=[0,1],
        help="foo")
parser.parse_args()

这甚至不像subparsers argparse期望读或写。我需要做的是添加互斥的组。任何人都知道如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

如果传递了正确的参数组合,您可以自行检查(使用基本的argparse功能):

parser = argparse.ArgumentParser()

parser.add_argument("-d","--device",
    default="system",
    help="foo")
parser.add_argument("-l", "--list",
    action="store_true")
parser.add_argument("-m","--mode",
    type=str,
    choices=["on","off","auto"],
    help="foo")
parser.add_argument("-s", "--season",
    type=str,
    choices=["winter","summer"],
    help="foo")
parser.add_argument("-p","--present",
    type=int,
    choices=[0,1],
    help="foo")
args = parser.parse_args()

# if user defines device but not any read/write argument raise exception
if args.device is not None and not args.list and all(arg is None for arg in (args.season, args.present, args.mode)):
    parser.error('Wrong arguments passed')

# if user defines read and write arguments at the same time raise exception
if args.list and not all(arg is None for arg in (args.season, args.present, args.mode)):
    parser.error('Wrong arguments passed')