当前位置: 首页 > 面试题库 >

如何获得optparse的OptionParser忽略无效选项?

邵沛
2023-03-14
问题内容

在python中[OptionParser](http://docs.python.org/library/optparse.html#optparse.OptionParser),如何指示它忽略提供给method的未定义选项parse_args

例如
我只--foo为我的OptionParser实例定义了选项,但是我parse_args用list调用
[ '--foo', '--bar' ]

编辑:
我不在乎是否将其从原始列表中筛选出来。我只想忽略未定义的选项。

我这样做的原因是因为我正在使用SCons的AddOption接口添加自定义生成选项。但是,其中一些选项指导目标的声明。因此,我需要在脚本的不同位置将它们从sys.argv中解析出来,而无需访问所有选项。最后,顶层的Scons
OptionParser将捕获命令行中所有未定义的选项。


问题答案:

根据synack的要求,在其他答案的注释中,我发布了一个解决方案的技巧,该解决方案在将输入传递给父级之前先将其净化OptionParser

import optparse
import re
import copy
import SCons

class NoErrOptionParser(optparse.OptionParser):
    def __init__(self,*args,**kwargs):
        self.valid_args_cre_list = []
        optparse.OptionParser.__init__(self, *args, **kwargs)

    def error(self,msg):
        pass

    def add_option(self,*args,**kwargs):
        self.valid_args_cre_list.append(re.compile('^'+args[0]+'='))
        optparse.OptionParser.add_option(self, *args, **kwargs)

    def parse_args(self,*args,**kwargs):
        # filter out invalid options
        args_to_parse = args[0]
        new_args_to_parse = []
        for a in args_to_parse:
            for cre in self.valid_args_cre_list:
                if cre.match(a):
                    new_args_to_parse.append(a)


        # nuke old values and insert the new
        while len(args_to_parse) > 0:
            args_to_parse.pop()
        for a in new_args_to_parse:
            args_to_parse.append(a)

        return optparse.OptionParser.parse_args(self,*args,**kwargs)


def AddOption_and_get_NoErrOptionParser( *args, **kwargs):
    apply( SCons.Script.AddOption, args, kwargs)
    no_err_optparser = NoErrOptionParser(optparse.SUPPRESS_USAGE)
    apply(no_err_optparser.add_option, args, kwargs)

    return no_err_optpars


 类似资料:
  • 目前我正在学习i18n,发现 影响资源的查找过程。该示例摘自Java™教程-快速示例稍作修改: 组织。i18n。I18N示例 已定义的默认资源消息绑定。性质 和3个附加资源文件 MessagesBundle_de_de.properties MessagesBundle_en_US属性 MessagesBundle_fr_FR属性 到目前为止,一切都很好。给出: 给出: 现在,我添加以下资源文件M

  • 我希望得到h3的内部文本,但我想忽略嵌套的跨度。 示例: 以下是我当前的代码: 它返回 也尝试了innerText没有成功,我不能设法从DOM删除跨度。

  • 问题内容: 我正在使用Business Intelligence 2008在SSRS中创建一个表。我有一个日期(作为字符串)作为表中使用的值之一。此值可以包含表示日期的字符串,也可以为空白。如果它有一个值,我想用另一种方式格式化该值。现在,我对显示它的单元格具有以下表达式: 如果该字段具有值,则可以完美地工作。但是,当该字段为空白时,该单元格将填充。如果我只有该功能,这将是有意义的,但似乎应该防止

  • 这应该很容易做到。我可以在Guzze3中找到很多关于如何做到这一点的参考资料,但是它们在Guzze5中不起作用。 我目前正在做的事情: 当我发送请求时,我收到了这个错误: 我在谷歌上找不到任何关于这个错误的有用参考。如果我可以访问旋度选项,那么我可以尝试类似这里建议的解决方案(这是针对Guzzle 3的,因此它不起作用):http://inchoo.net/dev-talk/symfony2-gu

  • 问题内容: 当我发送此请求时: 我的休息服务: 我期望得到一个例外,因为: 我的域模型中没有invalidField。 日期格式无效。 但是实际上我得到的测试对象具有空值。我的dmain模型是: 我认为这不是有效的行为。我该如何解决? 感谢帮助。 解: 正如Blaise Doughan所说,需要扩展MOXy的MOXyJsonProvider并重写preReadFrom方法以设置自定义javax.x

  • 我有一个包含无效字符的XML。LXML的XMLParser会对这些无效字符抛出异常,但当我使用recover=True选项创建XMLParser时,它会忽略错误字符并正常工作。 我的问题是如何为lxml的iterparse函数设置类似的标志? 繁殖: 断开的XML(/tmp/z.XML): 注意:字符串“Bad characters:”后面有两个ASCII字符#31(0x1F),我无法在这里复制粘