gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 06:15:45 25 4
gpt4 key购买 nike

我在 optparse 中为 OptionOptionParser 写了一个子类。我正在重写 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)

关于python - 在 python 中覆盖 OptionParser 的 add_option 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15821463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com