使用子解析器进行互斥标志选项

问题描述 投票:0回答:1

我编写了一个使用argparse的小程序。我特别想防止组合使用 3 个标志。我已经创建了一些代码来实现此目的,但它看起来不太优雅。我应该为此使用 sub_parsers 吗?我在这里找到的示例似乎解决了更复杂的标志选项,例如创建可以一起运行的标志组合以及限制与其他标志的组合。

这是我整理的:

parser.add_argument(-a) 
parser.add_argument(-b) 
parser.add_argument(-c) 
args = parser.parse_args() 

count = 0 
for item in [args.a, args.b, args.c]: 
  if item is not None: 
    count += 1 

if count > 1: raise Exception

它完成了工作,但我觉得我的循环和计数充其量只是临时的。有没有更好的办法? sub_parser 适合这种情况吗?

python argparse
1个回答
0
投票

如果这是一次性的,那么坚持你的解决方案,但如果你需要多个互斥的定义,查找表可能是你最好的选择:

parser.add_argument(-a) 
parser.add_argument(-b) 
parser.add_argument(-c) 
args = parser.parse_args()

processed_args = set()
mutex = {args.a : {args.b, args.c}, args.b : {args.a, args.c}, args.c : {args.a, args.b}}

for arg in args:
    processed_args.add(arg)
    if arg in mutex and any((temp in processed_args for temp in mutex[arg])):
        raise Exception("Found multiple mutually exclusive arguments!")
© www.soinside.com 2019 - 2024. All rights reserved.