使用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
并相应地设置我的布尔变量。
答案 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)