gpt4 book ai didi

python - 如何设置 argparse 以通过位置参数的值排除可选参数

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

arg 包含一个操作字段和修改操作行为的可选开关。

argparse 代码如下:

parser=argparse.ArgumentParser()
parser.add-argument('action',metavar='action', choices=['analysis','report','update'],nargs='?', default='report')
parser.add-argument('-d',dest='delay',type=int, choices=range(1,10),default=1)
parser.add-argument('-v',dest='verbose',action='store-true',default=False)
parser.add-argument('-o',dest='offline',action='store-true',default=False)
parser.add-argument('-n',dest='names',required=False)

我想让开关选项 -o、-d、-v 仅适用于 action=report,而选项 -n 仅适用于 action=analysis。

我知道有一个相互组设置,但它只是为参数设置的,而不是为参数值设置的!

顺便说一句,argparse 是否支持组合选项,例如 -vo...???

最佳答案

第一:是的,支持 -vo 等组合选项

现在进行 Action 切换:将 SubParser 添加到 ArgumentParser 正是您想要做的。请参阅第 15.4.5.1. Sub-commands 部分在 argparse 的文档中,所有内容都有详细解释,并配有示例

编辑:我知道请引用您在这篇文章下面的评论:如果您在程序调用中没有提供子命令参数,解析器通常会向您提供如何使用该程序的建议,然后以“参数太少错误”退出我重写了你的代码来显示这一点

测试.py

import argparse
parser=argparse.ArgumentParser()

subparsers = parser.add_subparsers(help='sub-command help')

parser_analysis = subparsers.add_parser('analysis', help='analysis help text')
parser_analysis.add_argument('-n',dest='names',required=False)

parser_report = subparsers.add_parser('report', help='report help text')
parser_report.add_argument('-d',dest='delay',type=int, choices=range(1,10),default=1)
parser_report.add_argument('-v',dest='verbose',action='store_true',default=False)
parser_report.add_argument('-o',dest='offline',action='store_true',default=False)

parser_update = subparsers.add_parser('update', help='update help text')
parser.parse_args()

现在使用不同的参数调用此 test.py:

$python test.py
usage: test.py [-h] {analysis,report,update} ...
test.py: error: too few arguments
$python test.py -h
usage: test.py [-h] {analysis,report,update} ...

positional arguments:
{analysis,report,update}
sub-command help
analysis analysis help text
report report help text
update update help text

optional arguments:
-h, --help show this help message and exit
$python test.py report -h
usage: test.py report [-h] [-d {1,2,3,4,5,6,7,8,9}] [-v] [-o]

optional arguments:
-h, --help show this help message and exit
-d {1,2,3,4,5,6,7,8,9}
-v
-o

因此,据我所知,唯一的问题是程序在没有任何子命令的情况下调用 python test.py 后抛出错误。所以我会做某事。像这样

try:
args=parser.parse_args()
except:
exit(0)

以避免用户看到存在未处理的错误。然后,您将获得与 svn 命令相同的行为。

如果您想以执行默认子命令的方式处理此问题,则必须执行以下操作:就像这篇文章的答案中提到的:

Argparse - How to Specify a Default Subcommand

import sys
#...your parser definitions
if (len(sys.argv) < 2):
args = parser.parse_args(['update'])
else:
args = parser.parse_args()

如果sys.argv中的参数列表小于2,这将解析命令update。为什么是2?因为参数列表中的第一个参数始终是您调用的程序,即 test.py

问题是,你真的想要这种行为吗?因为如果我总是可以调用 test.py ,就不需要调用 test.py update ,所以用户可能会变得懒惰,永远不会使用 test.py update 命令。此外,如果您稍后想要不同的默认行为,例如 test.py 启动交互模式,那么习惯于调用 test.py 进行更新的用户将会感到困惑,或者他们的使用您的程序的脚本被破坏。

关于python - 如何设置 argparse 以通过位置参数的值排除可选参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22470483/

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