optparse():输入验证

时间:2011-07-12 19:21:06

标签: python validation optparse

如果它已经在某个地方得到了解答,我会提前道歉;自上个小时以来我一直在python网站。但是我没弄明白我怎么能这样做。我的脚本应该采用这样的选项:

myScript.py -f <file-name> -e [/ -d]
myScript.py -s <string> -e [/ -d]
myScript.py -f <file-name> [/ -s <string>] -e -w [<file_name>]

即。 -f / -s-e / -d是强制性选项,但-f&amp; -s不能与{-e一起使用1}}&amp; -d选项 - 不能一起使用。我怎样才能把支票放到位?

另一个问题,如果我可以同时询问:我如何使用-w选项(使用时)或没有值?如果没有提供任何值,则应采用默认值,否则为提供的值。 任何帮助非常感谢。干杯!!

2 个答案:

答案 0 :(得分:2)

如果您使用的是2.7+,则应尝试使用argparseThis section应该是你想要的。

Tl;博士:

parser = argparse.ArgumentParser()
group = parser.add_mutually_exclusive_group()
group.add_argument('--foo', action='store_true')
group.add_argument('--bar', action='store_false')

使--foo--bar相互排斥。有关使用argparse s

的更多信息,请参阅详细的ArgumentParser用法

请注意,optparse已被弃用,因此无论如何使用argparse都是个好主意。

答案 1 :(得分:2)

我用optparse做了一段时间,但我简要介绍了docs和一个旧程序。

-f / -s,-e / -d是强制性选项,但-f&amp; -s不能一起使用,与-e&amp; -d选项相同 - 不能一起使用。怎么能我把检查放到了位置?

对于互斥性,您必须自己进行检查,例如:

parser.add_option("-e", help="e desc", dest="e_opt", action="store_true")
parser.add_option("-d", help="d desc", dest="d_opt", action="store_true")
(opts, args) = parser.parse_args()
if (parser.has_option("-e") and parser.has_option("-d")):
    print "Error!  Found both d and e options.  You can't do that!"
    sys.exit(1)

由于这里的示例选项是布尔值,您可以将上面的if行替换为:

if (opts.e_opt and opts.d_opt):

有关详情,请参阅How optparse handles errors部分。

如何使用-w选项(使用时)或没有值?

我从来没有找到一种方法来获得一个optparse选项,其值是,可选的。 AFAIK,您必须将选项设置为具有值或没有值。我最接近的是为必须具有值的选项指定default value。然后,不必在命令行上指定该条目。示例代码:

parser.add_option("-w", help="warning", dest="warn", default=0)

抛开一个(希望是有帮助的)建议:

如果你看过这些文档,你确实看到了关于“强制性选项”是一个矛盾的部分,对吗? ; -p除了幽默之外,您可能需要考虑重新设计界面,以便:

  • 未使用“选项”输入所需信息。
  • 只有一个参数(或参数组)输入可以互斥的数据。换句话说,不是“-e”或“-d”,而是“-e on”或“-e off”。如果你想要“-v”这样的详细信息和“-q”这样的安静/详细关闭,你可以将这些值存储到一个变量中:
parser.add_option("-v", help="verbose on", dest="verbose", action="store_true")
parser.add_option("-q", help="verbose off", dest="verbose", action="store_false")

这个特例是从Handling boolean (flag) options部分借来的(略有扩展)。对于这样的事情,您可能还想查看Grouping Options部分;我没有使用过这个功能,所以不会多说一些。