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

时间:2014-03-18 04:35:45

标签: python argparse

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。

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

btw,argparse支持组合选项,如-vo ...... ???

1 个答案:

答案 0 :(得分:2)

首先:是的,支持像-vo这样的组合选项

现在进行动作切换: 将SubParser添加到ArgumentParser非常符合您的要求。 请参阅argparse文档中的15.4.5.1. Sub-commands部分,一切都有详细解释,并以示例为例

编辑: 我知道请参阅此帖子下面的评论: 如果你没有在程序调用中提供子命令参数,那么解析器通常会给你一个关于如何使用该程序的建议,然后退出一个"太少的参数错误" 我重写了你的代码以显示这个

<强> test.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而没有任何子命令后抛出错误。所以我会做s.th.像这样

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

以避免用户发现存在未处理的错误。然后,您具有与svn命令相同的行为。

如果要以执行默认子命令的方式处理此问题,则必须执行s.th.就像这篇帖子中提到的那样:

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()

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

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