在optparse中,负布尔选项--no-whatever是什么意思?

8
使用 optparse,有没有一种简单的方法来定义负选项,例如 --no-cleanup
我是这样做的,但它很繁琐且容易出错,特别是由于易于忘记和省略的 None 检查:
#!/bin/env python

from __future__ import print_function
import sys
import optparse

def main(argv):
    parser = optparse.OptionParser("usage: %prog [options]")
    parser.add_option("--no-cleanup",
                      dest = "cleanup",
                      action = "store_false",
                      help = "do cleanup at end?")

    (opts, args) = parser.parse_args()

    if opts.cleanup == None:
        opts.cleanup = True

    # do stuff ...

    if opts.cleanup:
        print("Cleaning up!", file = sys.stderr)
    else:
        print("Not cleaning up", file = sys.stderr)

if __name__ == "__main__":
    main(sys.argv[1:])

理想情况下,我希望能够像Perl中的Getoptions :: Long一样做一些事情,其中我可以将选项cleanup定义为布尔值,然后它将自动提供--cleanup--no-cleanup,并相应地设置我的布尔变量。

1
argparse有这个功能吗?或者这不是一个选项? - jterrace
@jterrace:我使用Python v2.6,所以我认为我没有argparse。 - Frank
3
@Frank,argparse 可以在 Python2.6 上运行,只是它不在标准库中。如果您安装了 setuptools,执行 easy_install argparse 命令对我来说一直可以正常工作。 - mgilson
1
@jterrace,我不完全确定在这种情况下argparse比optparse具有更多的功能(尽管我仍然强烈推荐它优于optparse)。 - mgilson
2
还有一个评论...通常在测试None时使用is运算符是更好的实践,因为None是单例。(这样重载__eq__的用户定义类保证不会评估为True) -- 换句话说,myclassinstance == None可能是True,而myclassinstance is None永远不会。 - mgilson
谢谢大家!我现在使用 pip-python 安装了 argparse。 - Frank
1个回答

4

如果我要使用optparse(或argparse,假设你想在一个命令中添加--cleanup和--no-cleanup标志),我只需要继承选项解析器类... 就像这样:

from optparse import OptionParser
class MyOptParse(OptionParser):
      def boolean(self,dest,**kwargs):
          self.add_option('--%s'%dest,dest=dest,action='store_true',**kwargs)
          self.add_option('--no-%s'%dest,dest=dest,action='store_false',**kwargs)

当然,这是一个完全的hack,但我认为很明显我要说什么……你可以使布尔类型按照你想要的方式工作(重新格式化帮助信息、接受默认值,以便将“--blah”或“--no-blah”设置为默认值等等)。
我认为
parser=MyOptParse()
parser.boolean('cleanup',default=True,help="Do/Do Not do cleanup")

如果默认值已经设置,应该可以正常工作并且不需要if options.cleanup is None这一行代码,尽管帮助信息将被重复显示(使用我提供的代码)。如果您只想为特定标志添加默认值(以消除对None的检查),则可以使用default关键字向add_option中添加默认值。或者,根据optparse文档... OptionParser的set_defaults()方法是指定默认值的更清晰的方法,您可以在调用parse_args()之前随时调用它:例如:parser.set_defaults(verbose=True)

你应该在 dest 参数中添加 .replace('-', '_')。是否可以像 man gcc 那样压缩帮助信息,以避免冗余? - Ruggero Turra

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接