Python: How to make an option to be required in optparse?

前端 未结 9 2023
走了就别回头了
走了就别回头了 2021-02-05 00:57

I\'ve read this http://docs.python.org/release/2.6.2/library/optparse.html

But I\'m not so clear how to make an option to be required in optparse?

I\'ve tried to

9条回答
  •  太阳男子
    2021-02-05 01:36

    There are at least two methods of implementing required options with optparse. As mentioned in the docs page, optparse doesn’t prevent you from implementing required options, but doesn’t give you much help at it either. Find below the examples found in files distributed with the source.

    Although please note that optparse module is deprecated since version 2.7 and will not be developed further. You should use argparse module instead.


    Version 1: Add a method to OptionParser which applications must call after parsing arguments:

    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")
    

    Source: docs/lib/required_1.txt


    Version 2: Extend Option and add a required attribute; extend OptionParser to ensure that required options are present after parsing:

    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
    

    Source: docs/lib/required_2.txt

提交回复
热议问题