2

我已经为optparse编写了一个子类OptionOptionParser我正在重写add_optionOptionParser 中的函数以使其解析新关键字。以下是我的代码。

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 instance has no attribute ' getitem ' if def 没有指定并且如果def指定它给我一个错误,说 no type like 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。我该如何解决这个问题?

4

1 回答 1

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)
于 2013-04-04T23:07:30.900 回答