【问题标题】:Using argparse to accept only one group of required arguments使用 argparse 只接受一组必需的参数
【发布时间】:2017-06-01 14:52:52
【问题描述】:

我正在尝试将parser = argparse.ArgumentParser 用于我编写的 lil 程序。

程序接受EITHER(一个txt文件的路径)OR(opt1&&opt2&&opt3)作为输入。

意思是如果用户想使用 txt 文件作为输入,他不能提供 opt 和如果他提供任何 opt - 他必须提供所有 3 并且不能提供 a path to a txt file

我尝试使用add_mutually_exclusive_group,但不确定如何使用,因为第二组参数本​​身就是一个组。

这是我迄今为止尝试过的:

import argparse
parser = argparse.ArgumentParser(description='this is the description',)

root_group = parser.add_mutually_exclusive_group()

group_list = root_group.add_mutually_exclusive_group()
group_list.add_argument('-path', help='path to the txt file')

group_list = root_group.add_mutually_exclusive_group()
group_list.add_argument('-opt1', help='opt1')
group_list.add_argument('-opt2', help='opt2')
group_list.add_argument('-opt3', help='opt3')

args = parser.parse_args()

-

python tests.py -path txt -opt1 asdasd
usage: tests.py [-h] [[-path PATH] [-opt1 OPT1 | -opt2 OPT2 | -opt3 OPT3]
tests.py: error: argument -opt1: not allowed with argument -path

path 不允许与任何opt 一起使用——这正是我想要的。

但我希望,即使用户提供了 1 个 opt,他也必须提供所有这些。

我还希望至少有 1 组得到满足。

【问题讨论】:

  • 请展示你的尝试,并解释它是如何不充分的。
  • 编辑了第一篇文章。谢谢
  • 那么您的标题具有误导性;你想要一组选项的全部或全部。
  • 是的,但我只想要一组
  • 通过将opt1opt2opt3 放在same mulually_exclusive_group 中,您保证只能选择其中一个。

标签: argparse


【解决方案1】:

互斥组不是为嵌套而设计的。它接受您的代码,但最终效果是使 4 个参数独占。它将只接受pathopt1opt2 等之一。

虽然我探索了定义嵌套组,并允许在组内进行anyand 操作,但这样的功能还有很长的路要走。

由于您的用户必须提供全部 3 个--opt,我建议将其压缩为一个参数:

root_group.add_argument('--opt', nargs=3)
root_group.add_argument('--path')

用法应该类似于

usage: tests.py [-h]  [--path PATH | --opt OPT OPT OPT]

与允许nested inclusive groups 的假设用法对比:

[-path PATH | [-opt1 OPT1 & -opt2 OPT2 & -opt3 OPT3]]

============

使用元组元变量,可以将用法细化为:

g.add_argument('--opt',nargs=3,metavar=('OPT1','OPT2','OPT3'))

usage: ipython3 [-h] [--path PATH | --opt OPT1 OPT2 OPT3]

=============

您的另一个选择是编写自定义usage 并在解析后执行您自己的逻辑测试。

【讨论】:

    【解决方案2】:

    我会改用子命令解析器。您的“选项”并不是真正的可选;它们是特定上下文中的 3 个必需参数。

    import argparse
    
    p = argparse.ArgumentParser()
    sp = p.add_subparsers()
    
    p1 = sp.add_parser('file')
    p1.add_argument('path')
    
    p2 = sp.add_parser('opts')
    p2.add_argument('opt1')
    p2.add_argument('opt2')
    p2.add_argument('opt3')
    
    args = parser.parse_args()
    

    然后你会调用你的脚本

    python tmp.py file foo.txt
    

    python tmp.py opts 1 2 3
    

    帮助将告诉您所需的位置参数,其值为fileopts

    % python tmp.py -h
    usage: tmp.py [-h] {file,opts} ...
    
    positional arguments:
      {file,opts}
    
    optional arguments:
      -h, --help   show this help message and exit
    

    每个子命令都有自己的使用信息:

    % python tmp.py file -h
    usage: tmp.py file [-h] path
    
    positional arguments:
      path
    
    optional arguments:
      -h, --help  show this help message and exit
    % python tmp.py opts -h
    usage: tmp.py opts [-h] opt1 opt2 opt3
    
    positional arguments:
      opt1
      opt2
      opt3
    
    optional arguments:
      -h, --help  show this help message and exit
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-24
      • 2019-03-12
      • 2021-07-15
      • 2021-08-08
      • 1970-01-01
      • 2015-10-09
      • 2014-08-02
      • 2014-10-14
      相关资源
      最近更新 更多