我在optparse中为Option
和OptionParser
编写了一个子类。我重写了OptionParser中的add_option
函数,使其解析了一个新的关键字。以下是我的代码。
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
现在,如果我这样做,它可以正常工作。
parser = MyOptionParser()
parser.add_option("-f", "--file", dest="filename",
help="write report to FILE", metavar="FILE", deft ="xyz")
但是,如果我这样做(我想要),它会给我一个错误:MyOption实例没有属性' getitem '如果未指定def并且指定了def
,则会向我显示错误,指出类似def
的类型。
parser = MyOptionParser()
parser.add_option(MyOption("-f", "--file", dest="filename",
help="write report to FILE", metavar="FILE", def ="xyz"))
我认为问题是我在使用MyOption(opts,args)时传递了一个对象,因此它无法访问args / kwargs。我该如何解决这个问题?
答案 0 :(得分:1)
add_option
基本上直接调用option_class
的构造函数(这是OptionParser
构造函数的默认参数,默认为optparse.Option
)。
所以,你应该只是覆盖MyOption.__init__
而不是覆盖OptionParser.add_option
):
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)
如果您希望能够支持
之类的语法parser.add_option("-f", "--file", dest="filename",
help="write report to FILE", metavar="FILE", deft ="xyz")
然后确保在制作option_class
时设置OptionParser
:
parser = MyOptionParser(option_class=MyOption)