0

我正在使用 parser.add_option 到我的 optionparser。最初有 5 个选项,现在有 13 个参数。所以我的代码有 13 行 passrser.add_option; 它还有一行很长的代码来检查每个选项是否为 None 并在任何必填字段为空时抛出 parser.error。

反正有没有使这个简洁?

谢谢 ps1:我使用的是 python 2.6

ps2:示例代码:

usage = "usage:  -b <bname> -a <aname> -c <cname> -d <dname> -i <iname> -t <tname> -r <rname> -k <kname> -s <sname> -e <ename> -f <fname> -g <gname> -u <uname>"
parser=OptionParser(usage)
parser.add_option("-b", "--bname", dest="bname",help="Enter the bname")
parser.add_option("-a", "--aname", dest="aname",help="Is aname required? True/False")
parser.add_option("-c", "--cname", dest="cname", help="Is cname? True/False")
parser.add_option("-d", "--dname", dest="dname", help="Is dname required? True/False")
parser.add_option("-i", "--iname", dest="iname", help="Is iname required? True/False")
parser.add_option("-t", "--tname", dest="tname", help="Is tname required? True/False")
parser.add_option("-r", "--rname", dest="rname", help="Is rname required? True/False")
parser.add_option("-k", "--kname", dest="kname", help="Is kname required? True/False")
parser.add_option("-s", "--sname", dest="sname", help="Is sname required? True/False")
parser.add_option("-e", "--ename", dest="ename", help="Is ename required? True/False")
parser.add_option("-f", "--fname", dest="fname", help="Is fname required? True/False")
parser.add_option("-g", "--gname", dest="gname", help="Is gname required? True/False")
parser.add_option("-u", "--uname", dest="uname", help="Enter your user name")

(options, args) = parser.parse_args()

if(options.bname is None or options.aname is None or options.cname is None or options.dname is None or options.iname is None or options.tname is None or options.rname is None or options.kname is None or options.sname is None or options.ename is None or options.uname is None or options.gname is None or options.fname is None):
     parser.error("-b -v -a -c -d -i -t -r -k -s -e -u -f -g  are all required parameters")
4

3 回答 3

2

使用argparse而不是optparse

import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--bname", "-b", required=True, help="Enter the bname")
parser.add_argument("--aname", "-a", required=True, help="Is aname required? True/False")
parser.add_argument("--cname", "-c", required=True, help="Is cname? True/False")
parser.add_argument("--dname", "-d", required=True, help="Is dname required? True/False")
parser.add_argument("--iname", "-i", required=True, help="Is iname required? True/False")
parser.add_argument("--tname", "-t", required=True, help="Is tname required? True/False")
parser.add_argument("--rname", "-r", required=True, help="Is rname required? True/False")
parser.add_argument("--kname", "-k", required=True, help="Is kname required? True/False")
parser.add_argument("--sname", "-s", required=True, help="Is sname required? True/False")
parser.add_argument("--ename", "-e", required=True, help="Is ename required? True/False")
parser.add_argument("--fname", "-f", required=True, help="Is fname required? True/False")
parser.add_argument("--gname", "-g", required=True, help="Is gname required? True/False")
parser.add_argument("--uname", "-u", required=True, help="Enter your user name")

args = parser.parse_args()

使用 argparse:

  • 您不需要指定dest参数。默认情况下,该 dest值设置为参数的长选项名称。(例如,设置为的"--bname"原因,选项的值可以访问为。)destbnameargs.bname
  • 你不需要使用巨大的if语句;刚刚设置 required=True

Argparse 与所有 Python 版本 >= 2.3 兼容。即使没有管理员权限也很容易安装。本地安装的综合解决方案是使用virtualenv,但如果您不想达到那个长度,只需将 argparse.py 放在 PYTHONPATH 中列出的任何目录中即可安装 argparse。

于 2013-10-14T17:43:13.663 回答
1

这段代码构造了用法和选项,以及从一个简单的字母列表中进行的测试。它只是直接 Python 使用循环来执行重复性任务。

from optparse import OptionParser

alist = list('abcdef')

usage = ['usage: ']
for a in alist:
    usage.append('-%s <%sname>'%(a,a))
usage = ' '.join(usage)
# could also be written as a comprehension

parser = OptionParser(usage)
for a in alist:
    parser.add_option('-%s'%a, '--%sname'%a, dest='%sname'%a,help='%s help'%a)

(options,args) = parser.parse_args()

errormsg = usage  # just to keep things simple for this example
for a in alist:
    if getattr(options,'%sname'%a) is None:
        parser.error(errormsg)
print options

argparse.py可以下载并与 pre 2.7 Python 一起使用。主要优点是argparse可以为您处理使用和错误测试。

于 2013-10-15T01:24:06.357 回答
1

有多种方法可以缩短此代码;例如,您可以替换的所有变体

parser.add_option("-a", "--aname", dest="aname", help="Is aname required? True/False")

有一个循环

for c in "aitrksefg":
    parser.add_option("-%s" % c, "--%sname" % c, dest="%sname" % c,
                      help="Is %sname required? True/False" % c)

正如 Edsger Dijkstra 所说,“两个或更多?使用一个for”。

至于表情

(options.bname is None or options.aname is None or options.cname is None or options.dname is None or options.iname is None or options.tname is None or options.rname is None or options.kname is None or options.sname is None or options.ename is None or options.uname is None or options.gname is None or options.fname is None)

可以缩写的

None in (options.bname, options.aname, ...)

甚至更进一步

None in (getattr(options, "%sname" % c) for c in "bacditrkseugf")

尽管您实际上并不需要它,但正如 unutbu 所指出的那样。

于 2013-10-14T17:45:44.097 回答