使用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/