Существует как минимум два способа реализации требуемых опций с optparse
. Как упомянуто на странице документов , optparse не мешает вам реализовать необходимые опции, но и не дает вам большой помощи в этом. Ниже приведены примеры, найденные в файлах, распространяемых вместе с источником.
Хотя обратите внимание, что optparse
модуль устарел с версии 2.7 и не будет развиваться дальше. Вы должны использовать argparse
module .
Версия 1: добавьте метод в OptionParser, который приложения должны вызывать после анализа аргументов:
import optparse
class OptionParser (optparse.OptionParser):
def check_required (self, opt):
option = self.get_option(opt)
# Assumes the option's 'default' is set to None!
if getattr(self.values, option.dest) is None:
self.error("%s option not supplied" % option)
parser = OptionParser()
parser.add_option("-v", action="count", dest="verbose")
parser.add_option("-f", "--file", default=None)
(options, args) = parser.parse_args()
print "verbose:", options.verbose
print "file:", options.file
parser.check_required("-f")
Источник: docs/lib/required_1.txt
Версия 2: Расширить Option и добавить обязательный атрибут; расширьте OptionParser, чтобы обеспечить наличие необходимых параметров после синтаксического анализа:
import optparse
class Option (optparse.Option):
ATTRS = optparse.Option.ATTRS + ['required']
def _check_required (self):
if self.required and not self.takes_value():
raise OptionError(
"required flag set for option that doesn't take a value",
self)
# Make sure _check_required() is called from the constructor!
CHECK_METHODS = optparse.Option.CHECK_METHODS + [_check_required]
def process (self, opt, value, values, parser):
optparse.Option.process(self, opt, value, values, parser)
parser.option_seen[self] = 1
class OptionParser (optparse.OptionParser):
def _init_parsing_state (self):
optparse.OptionParser._init_parsing_state(self)
self.option_seen = {}
def check_values (self, values, args):
for option in self.option_list:
if (isinstance(option, Option) and
option.required and
not self.option_seen.has_key(option)):
self.error("%s not supplied" % option)
return (values, args)
parser = OptionParser(option_list=[
Option("-v", action="count", dest="verbose"),
Option("-f", "--file", required=1)])
(options, args) = parser.parse_args()
print "verbose:", options.verbose
print "file:", options.file
Источник: docs/lib/required_2.txt