Как я могу заставить OptionParser optparse игнорировать недопустимые опции?

Это инкапсулирует установку и доступ тех участников. Если некоторое время с этого времени разработчик для кода должен изменить логику, когда к участнику получают доступ или установил его, может быть сделан, не изменяя контракт класса.

23
задан Gringo Suave 9 February 2013 в 01:35
поделиться

2 ответа

На запрос синака в комментариях к другому ответу я отправляю свой хак решения, которое дезинфицирует входы перед передачей их родителю 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
1
ответ дан 29 November 2019 в 01:16
поделиться

По умолчанию нет возможности изменить поведение вызова error () , который возникает при передаче неопределенного параметра. Из документации в конце раздела , как optparse обрабатывает ошибки :

Если поведение optparse при обработке ошибок по умолчанию не соответствует вашим потребностям, вам необходимо подкласс OptionParser и переопределите его методы exit () и / или error ().

Простейший пример этого:

class MyOptionParser(OptionParser):
    def error(self, msg):
        pass

Это просто заставит все вызовы error () ничего не делать. Конечно, это не идеально, но я считаю, что это показывает, что вам нужно сделать. Помните о строке документации из error () , и вы должны быть готовы продолжить:

Распечатайте сообщение об использовании, включающее 'msg' в stderr и Выход. Если вы переопределите это в подклассе, он не должен возвращаться - он должен либо выйти, либо вызвать исключение.

11
ответ дан 29 November 2019 в 01:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: