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:])

理想情况下,我想Getoptions::Long在 Perl 中做类似的事情,在那里我可以将一个选项定义cleanup为布尔值,然后它会自动提供--cleanup--no-cleanup相应地设置我的布尔变量。

4

1 回答 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),您可以根据 optparse 文档使用 default 关键字来添加选项,或者...

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

于 2012-03-29T22:31:40.387 回答