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
是必须的选项,但-f
和-s
不能同时使用,-e
和-d
也是一样,不能同时使用。我该怎么检查这个呢?
还有一个问题,能不能请教一下:-w
选项怎么用(如果使用的话),可以有值也可以没有值?如果没有提供值,就应该使用默认值;如果提供了值,就用提供的那个。非常感谢任何帮助!谢谢!!
2 个回答
如果你使用的是2.7以上的版本,建议你试试 argparse
。这一部分应该正是你需要的内容。
简单来说:
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
不能同时使用,也就是说你只能选择其中一个。想了解更多关于如何使用 ArgumentParser
的详细信息,可以查看 argparse
的使用说明。
记住,optparse
已经不再推荐使用,所以使用 argparse
是个不错的选择。
我很久没用过optparse了,不过我简单看了一下文档和一个旧程序。
“-f/-s和-e/-d是必须的选项,但-f和-s不能同时使用,-e和-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):
想了解更多,可以查看optparse如何处理错误的部分。
“我怎么能使用-w选项(如果使用的话)而不带值或带值呢?”
我从来没找到过一个optparse选项,它的值是可选的。根据我所知,你必须设置选项要么有值,要么没有值。我最接近的做法是为一个必须有值的选项指定一个默认值。这样在命令行上就不需要指定这个值了。示例代码:
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")
这个例子是借鉴自处理布尔(标志)选项的部分,并稍作扩展。对于这样的情况,你可能还想看看分组选项的部分;我没有使用过这个功能,所以不多说了。