负布尔选项 - 无论在optparse中是什么?

时间:2012-03-29 22:12:43

标签: python optparse

使用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 个答案:

答案 0 :(得分: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)

当然,这是一个完整的黑客攻击,但我认为它很明显我将继续使用它......你可以根据需要设置布尔值(重新格式化帮助,接受默认值以便' --blah'或'--no-blah'被设置为默认值等等。)

我认为

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

应该工作并且除了if options.cleanup is None行之外它已经设置了默认设置,虽然帮助消息将被重复(使用我提供的代码)

如果您只想为特定标志添加默认值(以取消对None的检查),您可以根据optparse文档使用默认关键字add_option,OR ...

  

更明确的指定默认值的方法是OptionParser的 set_defaults()方法,您可以在调用 parse_args()之前随时调用该方法:例如: parser.set_defaults(verbose=True)