Skip to main content
 首页 » 编程设计

python之在 python 中覆盖 OptionParser 的 add_option 函数

2025年05月04日11yxwkf

我在 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") 

但如果我这样做(我想这样做),它会给我一个错误:如果未指定 def 且 def,MyOption 实例没有属性 'getitem'指定它给我一个错误,说没有像 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。我该如何解决这个问题?

请您参考如下方法:

add_option 基本上直接调用 option_class 的构造函数(这是 OptionParser 构造函数的默认参数,默认为 optparse.选项).

因此,您可能应该只覆盖 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") 

然后确保在制作 OptionParser 时设置 option_class:

parser = MyOptionParser(option_class=MyOption)