【问题标题】:argparse: Change number of required positional arguments based on required choices optionargparse:根据所需的选择选项更改所需位置参数的数量
【发布时间】:2020-11-03 00:51:34
【问题描述】:

我设想我的应用程序有两种主要的操作模式:

  1. 从文件中读取值并对其进行操作
  2. 从一个范围内生成值并对其进行操作。

我的应用程序将被调用为:

myApp.py --type range 1000 2000

myApp.py --type from-file /tmp/myfile.csv

为了简洁起见,我省略了几个额外的选项,但它们使完整的参数处理器变得相关。

如果我选择范围,我需要 2 个位置参数,但如果我选择从文件,我只需要一个。可以使用 argparse 来根据 type 选项强制执行正确数量的位置参数吗?也许“选择”不是最好的 argparse 类型,有更好的方法吗?

import argparse
parser = argparse.ArgumentParser(description='myApp')

parser.add_argument('--type', '-t', choices=['range', 'from-file'], required=True,
                    help='Generate values from a range or load from a file.')
# Stuff here for argparse to enforce the correct number of positional parameters.

args = parser.parse_args()

另外,有没有一种好方法(比如内置于 argparse)使得不需要“--type”,但我可以运行我的应用程序:

myApp.py range 1000 2000

myApp.py from-file /tmp/myfile.csv

我希望 argparse 仍然强制 'range' 和 'from-file' 是唯一有效的选项,并且 2 个参数必须跟随 'range' 或 1 个参数必须跟随 'from-file'。

编辑:

我也可以使用以下调用:

myApp.py --range 1000 2000

myApp.py --from-file /tmp/myfile.csv

这可能会使需要 2 对 1 位置参数的过程更容易。但是我希望 argparse 强制指定两个选项之一,而不是同时指定。 argparse 能做到吗?

谢谢

【问题讨论】:

  • 查看 ArgumentParser.add_mutually_exclusive_group 的排他性。不过,我不擅长位置参数。

标签: python arguments argparse options


【解决方案1】:

使用子解析器为每个子命令提供不同的参数。

import argparse


parser = argparse.ArgumentParser(description='myApp')
sp = parser.add_subparsers()

range_parser = sp.add_parser('range')
range_parser.add_argument('start')
range_parser.add_argument('end')
range_parser.set_defaults(type='range')

file_parser = sp.add_parser('from-file')
file_parser.add_argument('fname')
file_parser.set_defaults(type='file')


args = parser.parse_args()

if args.type == "range":
    start = args.start
    end = args.end
elif args.type == "from-file":
    # Maybe the file contains two lines, the start
    # and end numbers of the range.
    with open(args.file) as f:
        start = int(f.readline())
        end = int(f.readline())

然后使用myApp.py range 1000 2000myApp.py from-file /tmp/myfile.csvargs.type 将告诉您选择了哪个子命令(基于每个子解析器为 type 属性设置的默认值),并且只有在使用该子解析器时才会添加每个子解析器的参数。

【讨论】:

  • 谢谢!子解析器看起来正是我所需要的。您能否举例说明如何使用 args.type 来查找调用了哪一个?当我尝试print(args.type) 我得到AttributeError: 'Namespace' object has no attribute 'type'
  • 只是一个字符串:if args.type == "range": ....
  • 抱歉,我现在看到了 set_defaults。谢谢!
猜你喜欢
  • 2018-07-23
  • 1970-01-01
  • 2022-11-23
  • 2011-01-05
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-13
相关资源
最近更新 更多