Argparsing 互斥但单个标志的可选选择

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

任务

我需要一个标志

-y
,它可以从
[a,b,c]
中获取一个值和/或从
[e,f,g]
中获取一个值,并且不接受任何其他值。我希望
[a,b,c]
互斥,并且
[e,f,g]
互斥。我还要求(如果存在)
[a,b,c]
[e,f,g]
之前出现。

有效示例:

  • -呀
  • -yb
  • -耶
  • -yf
  • -yaf
  • -ybe
  • -ybf

无效示例:

  • -y
  • -雅布
  • -是的
  • -呀

我的发现

  • -type=str
    让我可以将值附加到
    -y
    的末尾。
  • -choices=
    让我可以指定有效的参数,但需要详尽无遗。我知道我可以使用
    itertools
    来生成此内容,但我希望帮助看起来像
    -y[abc][efg]     Help message.

我正在考虑在解析参数后检查该正则表达式是否有效。

-y[abc]?[efg]?[\r\n\s]?

有没有更好的方法来处理这个问题?我不知道 argparse 是否有内置方法来给出互斥参数列表。

例如

add_argument("-y",choices=\[\[a,b,c\],\[e,f,g\]\])

python argparse
1个回答
0
投票

一种可能的解决方案是创建所有有效的组合。比如:

import argparse
from itertools import product

g1 = ['a', 'b', 'c']
g2 = ['e', 'f', 'g']
cross = [''.join(x) for x in product(g1, g2)]

parser = argparse.ArgumentParser()
parser.add_argument('-y', choices=g1 + g2 + cross, metavar='[abc][efg]')
args = parser.parse_args()
© www.soinside.com 2019 - 2024. All rights reserved.