optparse(): 输入验证

3 投票
2 回答
3944 浏览
提问于 2025-04-16 21:22

如果之前已经有人回答过这个问题,我先说声抱歉;我刚在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

如果你使用的是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 是个不错的选择。

2

我很久没用过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")

这个例子是借鉴自处理布尔(标志)选项的部分,并稍作扩展。对于这样的情况,你可能还想看看分组选项的部分;我没有使用过这个功能,所以不多说了。

撰写回答