带参数的argparse组和互斥的\u组

2024-04-29 22:32:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下内容:

def parser():
    p = argparse.ArgumentParser()
    people = p.add_argument_group('people_list')
    meg = people.add_mutually_exclusive_group()
    meg.add_argument('--config-file')
    g = meg.add_argument_group('people')
    g.add_argument('--name')
    g.add_argument('--age')
    return p

p = parser()

p.parse_args(['--config-file', 'cfg_file', '--name', 'Bob', '--age', '3'])

我希望这将是由于mutually_exclusive组的缘故。注意,这是一段实际代码,我有几个argument_groups需要处理,但是在这个argument_group('people_list')中,我希望用户指定一个配置文件或任何其他参数。在

所以,我的用户应该可以说

^{pr2}$

或者

^{3}$

但不是

prog --config-file cfg_file --name Bob --age 3

我做错什么了?在


Tags: nameaddconfigparseragegroupexclusiveargument
1条回答
网友
1楼 · 发布于 2024-04-29 22:32:57

以下是帮助:

usage: foo [-h] [ config-file CONFIG_FILE] [ name NAME]
                        [ age AGE]

optional arguments:
  -h,  help            show this help message and exit

people_list:
   config-file CONFIG_FILE

people这样的参数组控制帮助行的显示方式。因此,标题为people_list的部分。在

互斥组控制如何格式化用法,并检查参数的共存性。从技术上讲,它是参数组的一个子类,但这两种类型的组没有太多的交互作用。在

您可以在参数组中嵌套一个互斥组,就像您在这里所做的那样。但不能将参数组嵌套到另一个组(任何一种)。或者更确切地说,它会接受这样一个定义,但它没有什么特别之处。因此name和{}已添加到解析器中(如用法所示),但没有添加到meg或{}。如果您将一个互斥组添加到另一个MXGroup,其效果就是创建一个大的平面组。在

所以,除了一个小的例外,不要试图将一个组嵌套在另一个组中。他们的定义不够笼统,不足以做任何有用的事情。在

如果将nameage添加到meg,则帮助将是:

^{pr2}$

这将反对将config-filename或{}一起使用。但它也反对同时使用name和{}。在

存在一个错误问题,要求通用嵌套的相互xxx组。一旦实现,它就可以处理这种广义逻辑。但是现在不行,假设你可以设置你想要的测试,理想的使用线是什么样子?设置测试相对容易,但要产生有意义的使用却困难得多。在

现在我建议你自己写usage。使用argument groups将参数帮助行分组。在解析之后做你自己的交互测试。您可以使用p.error...生成错误消息。如果你明智地选择了默认值,就不难检验这些论点

if args.config_file is not None and 
    (args.name is not None or args.age is not None): 
    p.error('...')

相关问题 更多 >