gpt4 book ai didi

python - 不能有多个子解析器参数

转载 作者:行者123 更新时间:2023-12-01 02:20:26 28 4
gpt4 key购买 nike

所以我尝试使用以下模式构建 CLI:

cli.py api new --config config.json

cli.py api del [api_name]

为了实现api,我将其添加为sup解析器

if __name__ == '__main__':

parser = argparse.ArgumentParser(prog='my prog')
subparsers = parser.add_subparsers(title='api', help='available actions')

api_parser = subparsers.add_parser('api')

从这里我认为我们可能需要添加两个新的子解析器来处理 newdel 子命令:

if __name__ == '__main__':

parser = argparse.ArgumentParser(prog='my prog')
subparsers = parser.add_subparsers(title='api', help='available actions')

api_parser = subparsers.add_parser('api')

api_new_subparsers = api_parser.add_subparsers(title='new', help='%(prog)s creates new api gateway')
api_del_subparsers = api_parser.add_subparsers(title='del', help='%(prog)s deletes an api gateway')

但我收到错误:不能有多个子解析器参数

我搜索了一下。大多数问题都与以下模式有关 cli.py cmdAcli.py cmdB。所以我开始想 argparse 也许无法达到这样的“深度”?

非常感谢。

最佳答案

首先,我不确定您是否理解 title 参数的用途。

In [332]: parser = argparse.ArgumentParser(prog='my_prog')
...: subparsers = parser.add_subparsers(title='api', help='available actions')
...: api_parser = subparsers.add_parser('api')
...:
In [333]: parser.print_help()
usage: my_prog [-h] {api} ...

optional arguments:
-h, --help show this help message and exit

api:
{api} available actions
In [334]: parser.parse_args('api'.split())
Out[334]: Namespace()

title 所做的只是在帮助中定义一个组。它不会改变解析。定义 dest 而不是 title(或除此之外):

In [335]: parser = argparse.ArgumentParser(prog='my_prog')
...: subparsers = parser.add_subparsers(dest='cmd', help='available actions')
...: api_parser = subparsers.add_parser('api')
...:
In [336]: parser.print_help()
usage: my_prog [-h] {api} ...

positional arguments:
{api} available actions

optional arguments:
-h, --help show this help message and exit
In [337]: parser.parse_args('api'.split())
Out[337]: Namespace(cmd='api')

这标识了 args 命名空间中的子解析器命令。

但是关于多个子解析器的问题 - argparse 不允许您定义它。你可以把它们嵌套起来。那就是你可以使用

sp2 = api_parser.add_subparsers(dest='foo')
sp2.add_parser('del')
sp2.add_parser('inc')

In [339]: parser.parse_args('api del'.split())
Out[339]: Namespace(cmd='api', foo='del')
In [340]: parser.parse_args('api inc'.split())
Out[340]: Namespace(cmd='api', foo='inc')
In [341]: parser.parse_args('api -h'.split())
usage: my_prog api [-h] {del,inc} ...

positional arguments:
{del,inc}

但是在您朝这个方向走得太远之前,您是否尝试过向 api_parser 添加普通参数?使用子解析器越深入,帮助显示就越困惑。

或者您可能不需要完整的子解析器机制。例如,使用选项定义两个位置:

In [345]: parser = argparse.ArgumentParser(prog='my_prog')
...: parser.add_argument('cmd1', choices=['api'], help='available actions')
...: ;
...: parser.add_argument('cmd2', choices=['del','inc']);
...:
In [347]: parser.parse_args('api inc'.split())
Out[347]: Namespace(cmd1='api', cmd2='inc')
In [348]: parser.parse_args('-h'.split())
usage: my_prog [-h] {api} {del,inc}

positional arguments:
{api} available actions
{del,inc}

关于python - 不能有多个子解析器参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48013977/

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