argparse:根据所需的选择选项更改所需位置参数的数量

argparse: Change number of required positional arguments based on required choices option

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

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

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

myApp.py --type range 1000 2000

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

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

如果我select范围,我需要2个位置参数,但如果我select来自文件,我只需要一个。 argparse 是否可用于根据类型选项强制执行正确数量的位置参数?也许“选择”不是最好的 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 能做到吗?

谢谢

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

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 属性设置的默认值),并且只有在使用该子解析器时才会添加每个子解析器的参数。