gpt4 book ai didi

python - argparse 可选位置参数和 subparsers 参数

转载 作者:太空宇宙 更新时间:2023-11-04 03:52:12 24 4
gpt4 key购买 nike

我有一个 python 脚本,它接受一个可选的位置参数并有几个子命令。其中一些子命令需要位置参数,有些则不需要。当我尝试使用不需要位置参数的子命令时出现的问题。考虑以下测试文件:

import argparse

argp = argparse.ArgumentParser()
argp.add_argument('inputfile', type=str, nargs='?',
help='input file to process')
argp.add_argument('--main_opt1', type=str,
help='global option')

subp = argp.add_subparsers(title='subcommands',
dest='parser_name',
help='additional help',
metavar="<command>")

tmpp = subp.add_parser('command1', help='command1 help')
tmpp.add_argument('pos_arg1', type=str,
help='positional argument')

print repr(argp.parse_args())

当我尝试使用子命令 command1 时第一个参数一切顺利。

macbook-pro:~ jmlopez$ python pytest.py filename command1 otherarg
Namespace(inputfile='filename', main_opt1=None, parser_name='command1', pos_arg1='otherarg')

但现在让我们假设 command1不需要第一个位置参数。

macbook-pro:~ jmlopez$ python pytest.py command1 otherarg
usage: pytest.py [-h] [--main_opt1 MAIN_OPT1] [inputfile] <command> ...
pytest.py: error: argument <command>: invalid choice: 'otherarg' (choose from 'command1')

我有点期待 inputfile设置为 None .有什么办法可以argparse可以预测 command1实际上是一个子命令,因此 inputfile应该设置为无吗?

最佳答案

对于 argp 来说,子解析器参数看起来就像另一个位置参数,一个接受选择(子解析器的名称)的参数。此外,argppos_arg1 一无所知。这在 tmpp 的参数列表中。

argp 看到 filename command1 otherarg 时,filenamecommand1 满足它的 2 个位置。 otherarg 然后在 tmpp 上传递。

使用 command1 otherarg,同样是 2 个字符串,2 个 argp 位置。 command 分配给 inputfile。没有逻辑可以回溯并说 command1 更适合 subcommands,或者 `tmpp' 需要这些字符串之一。

您可以将第一个位置更改为可选的 --inputfile

或者您可以inputfile tmpp 的另一个位置。如果许多子解析器需要它,请考虑使用 parents

argparse 不像你那么聪明,不能“提前思考”或“回溯”。如果它看起来做了一些聪明的事情,那是因为它使用 re 模式匹配来处理 nargs 值(例如?、*、+)。

编辑

“欺骗”argparse 将第一个位置识别为子解析器的一种方法是在它之后插入一个可选的。使用 command1 -b xxx otherarg-b xxx 会分解位置字符串列表,因此只有 command1inputfile< 匹配子命令

p=argparse.ArgumentParser()
p.add_argument('file',nargs='?',default='foo')
sp = p.add_subparsers(dest='cmd')
spp = sp.add_parser('cmd1')
spp.add_argument('subfile')
spp.add_argument('-b')

p.parse_args('cmd1 -b x three'.split())
# Namespace(b='x', cmd='cmd1', file='foo', subfile='three')

这里的问题是 argparse 如何处理带有变量 nargs 的位置词。第二个位置是子解析器这一事实并不重要。虽然 argparse 允许任何顺序的可变长度位置,但它如何处理它们可能会令人困惑。如果只有一个这样的位置,那么预测 argparse 会做什么会更容易,而且它出现在最后。

关于python - argparse 可选位置参数和 subparsers 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20746494/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com