2013-04-04 56 views
2

我在optparse中編寫了OptionOptionParser的子類。我重寫了OptionParser中的add_option函數,使其解析了一個新的關鍵字。以下是我的代碼。覆蓋python中的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(選,參數),因此它是不能夠訪問ARGS/kwargs。我如何解決這個問題?

+0

請發佈tracebacks,'process_args_for_def'和'MyOption._set_opt_strings'代碼。另外'def'是一個保留字,不能用作明確的參數名稱。 – 2013-04-04 20:58:39

+0

你可以發佈完整的追溯?另外,命名一個變量'def'應該是不可能的,因爲它是一個關鍵字:它甚至如何運行? – 2013-04-04 20:59:56

+0

我已經添加了'process_args_for_def','MyOption._set_opt_strings'和回溯。我有一個龐大的代碼庫,我只是試圖在這裏給出部分代碼。此外,我改變了kewword的名稱,並將其鍵入爲def而不是輕快。改變了它。謝謝 – user2242512 2013-04-04 22:16:10

回答

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) 
+0

@ nneonneo-謝謝你。我試過這個,它的工作原理。 – user2242512 2013-04-05 03:28:20