问题
I have written a subclass for Option
and OptionParser
in optparse. I am overriding the add_option
function in OptionParser to make it parse a new keyword. Following is my code.
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
Now if I do this, it works fine.
parser = MyOptionParser()
parser.add_option("-f", "--file", dest="filename",
help="write report to FILE", metavar="FILE", deft ="xyz")
But if I do this (which I want to) it gives me an error: MyOption instance has no attribute 'getitem' if def is not specified and if def
is specified it gives me an error saying no type like def
.
parser = MyOptionParser()
parser.add_option(MyOption("-f", "--file", dest="filename",
help="write report to FILE", metavar="FILE", def ="xyz"))
I think the problem is that I am passing an object when I use MyOption (opts,args) and hence it is not able to access the args/kwargs. How do I get around this problem?
回答1:
add_option
basically directly calls the constructor for option_class
(which is a default argument to the OptionParser
constructor that defaults to optparse.Option
).
So, you should probably just override MyOption.__init__
instead (without overriding 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)
If you want to be able to support syntax like
parser.add_option("-f", "--file", dest="filename",
help="write report to FILE", metavar="FILE", deft ="xyz")
then just make sure to set option_class
when making your OptionParser
:
parser = MyOptionParser(option_class=MyOption)
来源:https://stackoverflow.com/questions/15821463/overriding-optionparsers-add-option-function-in-python