overriding OptionParser's add_option function in python
我已经在optparse中为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | from optparse import Option, OptionError, OptionParser class MyOptionParser(OptionParser): def add_option(self,*args,**kwargs): ##add the new keyword"deft". If deft="some value", kwargs[default] = deft ##else process args to get deft if kwargs.has_key["deft"]: newDef = kwargs["deft"] del kwargs["deft"] else: newDef = process_args_for_deft(args) if newDef!= None kwargs["default"] = newDef modOpt = OptionParser.add_option(self,*args,**kwargs) class MyOption(Option): def _set_opt_strings(self, largs, rargs, values): #overridden method over here |
现在,如果执行此操作,它将正常工作。
1 2 3 | parser = MyOptionParser() parser.add_option("-f","--file", dest="filename", help="write report to FILE", metavar="FILE", deft ="xyz") |
但是,如果执行此操作(我想要这样做),则会给我一个错误:如果未指定def,并且如果指定了
1 2 3 | parser = MyOptionParser() parser.add_option(MyOption("-f","--file", dest="filename", help="write report to FILE", metavar="FILE", def ="xyz")) |
我认为问题是我使用MyOption(opts,args)时传递了一个对象,因此它无法访问args / kwargs。 我如何解决这个问题?
因此,您可能应该改写
1 2 3 4 5 6 7 8 9 10 | class MyOption(Option): def __init__(self, *args, **kwargs): if 'deft' in kwargs: newDef = kwargs.pop('deft') else: newDef = process_args_for_deft(args) if newDef is not None: kwargs["default"] = newDef Option.__init__(self, *args, **kwargs) |
如果您希望能够支持如下语法
1 2 | parser.add_option("-f","--file", dest="filename", help="write report to FILE", metavar="FILE", deft ="xyz") |
然后只需确保在制作
1 | parser = MyOptionParser(option_class=MyOption) |