gpt4 book ai didi

Python 参数解析 : Complex Argument Parsing Scenario

转载 作者:行者123 更新时间:2023-11-28 18:43:46 25 4
gpt4 key购买 nike

我想实现以下命令行参数解析场景:

我有 4 个参数:-g-wid-w1-w2

-w1-w2 总是一起出现

-wid(-w1 -w2) 是互斥的,但必须有一个

-g 是可选的;如果不指定只能出现(-w1 -w2),不能出现-wid

有没有一种优雅的方法可以使用 argparse 实现它,但没有子命令(我已经在子命令中了)?

我在考虑自定义操作,但是在操作主体中我需要知道最后一次调用它的时间(即最后一个参数被解析的时间),我不知道如何因为参数的数量和顺序可能会有所不同。

一些更多的解释以防万一:我正在编写的工具使用小部件和小工具参数 -g 创建了一个小工具。该小部件要么是现有的小部件 - 然后由其 ID -wid 引用,要么是使用参数 -w1 创建的新小部件- w2。如果未指定 -g,则该工具将仅使用 (-w1 -w2) 创建和存储新的小部件,而不创建小工具。

提前谢谢你。

最佳答案

如果您正确选择默认值,则可以轻松地测试“parse_args”之后的“命名空间”中参数值的逻辑组合。您也可以在那时发出解析器错误。有一个错误报告要求相互包容的组。在那里我建议添加通用组合测试的机制。但它仍然需要你自己的逻辑测试。

http://bugs.python.org/issue11588将“必须包含”组添加到 argparse

我在该问题中提出的解决方案的关键是使 seen_non_default_actions 变量可供程序员使用。这是一个列表(实际上是一组)已经看到的 Action (考虑到可选位置总是“看到”)。我希望看到更多关于如何混合使用包容性和排他性分组的讨论。

您指定:

I have 4 arguments: -g, -wid, -w1, and -w2. -w1 and -w2 always appear together -wid and (-w1 -w2) are mutually exclusive, but one or the other is required -g is optional; if it is not specified only (-w1 -w2) can appear, but not -wid

我想总结为:

complex_group('g', required_next_exclusive_group('wid', inclusive_group('w1','w2)))

w1,w2 可以替换为 '--w1w2',nargs=2。一个简单的“mutually_inclusive_group”可以在这里工作。但是 argparse 无法处理嵌套组。

widw1w2 可以放入所需的 mutually_exclusive_group

-g 需要像 if args.g is None and args.wid is None: error()

这样的测试

这是一个脚本,它的行为符合您的要求(我认为),使用了我在 Issue11588 中的最新补丁。 act_w1等是实际的 Action 对象,可能会出现在seen_actions列表中。测试函数在子解析器中注册,并在其 parse_know_args() 快结束时执行。

parser = argparse.ArgumentParser(usage='custom usage')
sp = parser.add_subparsers(dest='cmd')
sp.required = True
spp = sp.add_parser('cmd1')
act_g = spp.add_argument('-g')
act_wid = spp.add_argument('--wid')
act_w1 = spp.add_argument('--w1')
act_w2 = spp.add_argument('--w2')

@spp.crosstest # decorator to register this function with spp
def test1(spp, seen_actions, *args):
# seen_actions - list of actions that were seen by parser
if 1==len({act_w1, act_w2}.intersection(seen_actions)):
# error if only one of these was seen
parser.error('-w1 and -w2 always appear together')
@spp.crosstest
def test2(spp, seen_actions, *args):
# required mutually exclusive wid and (w1,w2 group)
if act_wid in seen_actions:
if act_w1 in seen_actions or act_w2 in seen_actions:
parser.error('-wid and (-w1 -w2) are mutually exclusive')
elif act_w1 not in seen_actions:
parser.error('wid or (w1 and w2) required')
@spp.crosstest
def test3(spp, seen_actions, *args):
# is this the simplest logical way of expressing this?
if act_g not in seen_actions and act_wid in seen_actions:
parser.error('not g, so not wid')
args = parser.parse_args()

在此示例中,我保存并测试操作对象是否存在。也可以使用 dest 字符串进行测试。我正在探索使此测试更加直观和用户友好的方法。一组扩展的装饰器似乎最有前途。

关于Python 参数解析 : Complex Argument Parsing Scenario,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22929087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com