Это инкапсулирует установку и доступ тех участников. Если некоторое время с этого времени разработчик для кода должен изменить логику, когда к участнику получают доступ или установил его, может быть сделан, не изменяя контракт класса.
На запрос синака в комментариях к другому ответу я отправляю свой хак решения, которое дезинфицирует входы перед передачей их родителю 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
По умолчанию нет возможности изменить поведение вызова error ()
, который возникает при передаче неопределенного параметра. Из документации в конце раздела , как optparse обрабатывает ошибки :
Если поведение optparse при обработке ошибок по умолчанию не соответствует вашим потребностям, вам необходимо подкласс OptionParser и переопределите его методы exit () и / или error ().
Простейший пример этого:
class MyOptionParser(OptionParser):
def error(self, msg):
pass
Это просто заставит все вызовы error ()
ничего не делать. Конечно, это не идеально, но я считаю, что это показывает, что вам нужно сделать. Помните о строке документации из error ()
, и вы должны быть готовы продолжить:
Распечатайте сообщение об использовании, включающее 'msg' в stderr и Выход. Если вы переопределите это в подклассе, он не должен возвращаться - он должен либо выйти, либо вызвать исключение.