使用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选项定义为boolean,然后它将自动提供--cleanup--no-cleanup并相应地设置我的boolean变量。

最佳答案

如果我要使用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)

当然,这是一个完整的技巧,但是我认为在其中使用它很明显...您可以使 bool 行为表现为您想要的样子(重新格式化帮助,接受默认值,以便'--blah '或'--no-blah'被设置为默认值,以此类推...)

我觉得
parser=MyOptParse()
parser.boolean('cleanup',default=True,help="Do/Do Not do cleanup")

因为设置了默认值,所以应该可以工作并摆脱if options.cleanup is None行,尽管会重复帮助消息(使用我提供的代码)

如果您只想为特定标志添加默认值(以摆脱对None的检查),则可以根据optparse文档将default关键字用于add_option OR。

关于python - 负 bool 选项-在optparse中什么都没有?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9934328/

10-12 17:51