argparse:根据所需的选择选项更改所需位置参数的数量
argparse: Change number of required positional arguments based on required choices option
我设想我的应用程序有两种主要的操作模式:
- 从文件中读取值并对其进行操作
- 从范围中生成值并对其进行操作。
我的应用程序将被调用为:
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 2000
或 myApp.py from-file /tmp/myfile.csv
。 args.type
会告诉您选择了哪个子命令(基于每个子解析器为 type
属性设置的默认值),并且只有在使用该子解析器时才会添加每个子解析器的参数。
我设想我的应用程序有两种主要的操作模式:
- 从文件中读取值并对其进行操作
- 从范围中生成值并对其进行操作。
我的应用程序将被调用为:
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 2000
或 myApp.py from-file /tmp/myfile.csv
。 args.type
会告诉您选择了哪个子命令(基于每个子解析器为 type
属性设置的默认值),并且只有在使用该子解析器时才会添加每个子解析器的参数。