1 """A powerful, extensible, and easy-to-use option parser.
3 By Greg Ward <gward@python.net>
5 Originally distributed as Optik.
7 For support, use the optik-users@lists.sourceforge.net mailing list
8 (http://lists.sourceforge.net/lists/listinfo/optik-users).
12 from optparse import OptionParser
14 parser = OptionParser()
15 parser.add_option("-f", "--file", dest="filename",
16 help="write report to FILE", metavar="FILE")
17 parser.add_option("-q", "--quiet",
18 action="store_false", dest="verbose", default=True,
19 help="don't print status messages to stdout")
21 (options, args) = parser.parse_args()
35 'IndentedHelpFormatter',
36 'TitledHelpFormatter',
39 'OptionConflictError',
44 Copyright (c) 2001-2006 Gregory P. Ward. All rights reserved.
45 Copyright (c) 2002-2006 Python Software Foundation. All rights reserved.
47 Redistribution and use in source and binary forms, with or without
48 modification, are permitted provided that the following conditions are
51 * Redistributions of source code must retain the above copyright
52 notice, this list of conditions and the following disclaimer.
54 * Redistributions in binary form must reproduce the above copyright
55 notice, this list of conditions and the following disclaimer in the
56 documentation and/or other materials provided with the distribution.
58 * Neither the name of the author nor the names of its
59 contributors may be used to endorse or promote products derived from
60 this software without specific prior written permission.
62 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
63 IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
64 TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
65 PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR
66 CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
67 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
68 PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
69 PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
70 LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
71 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
72 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
79 return "<%s at 0x%x: %s>" % (self
.__class
__.__name
__, id(self
), self
)
82 # This file was generated from:
83 # Id: option_parser.py 527 2006-07-23 15:21:30Z greg
84 # Id: option.py 522 2006-06-11 16:22:03Z gward
85 # Id: help.py 527 2006-07-23 15:21:30Z greg
86 # Id: errors.py 509 2006-04-20 00:58:24Z gward
89 from gettext
import gettext
96 class OptParseError (Exception):
97 def __init__(self
, msg
):
104 class OptionError (OptParseError
):
106 Raised if an Option instance is created with invalid or
107 inconsistent arguments.
110 def __init__(self
, msg
, option
):
112 self
.option_id
= str(option
)
116 return "option %s: %s" % (self
.option_id
, self
.msg
)
120 class OptionConflictError (OptionError
):
122 Raised if conflicting options are added to an OptionParser.
125 class OptionValueError (OptParseError
):
127 Raised if an invalid option value is encountered on the command
131 class BadOptionError (OptParseError
):
133 Raised if an invalid option is seen on the command line.
135 def __init__(self
, opt_str
):
136 self
.opt_str
= opt_str
139 return _("no such option: %s") % self
.opt_str
141 class AmbiguousOptionError (BadOptionError
):
143 Raised if an ambiguous option is seen on the command line.
145 def __init__(self
, opt_str
, possibilities
):
146 BadOptionError
.__init
__(self
, opt_str
)
147 self
.possibilities
= possibilities
150 return (_("ambiguous option: %s (%s?)")
151 % (self
.opt_str
, ", ".join(self
.possibilities
)))
157 Abstract base class for formatting option help. OptionParser
158 instances should use one of the HelpFormatter subclasses for
159 formatting help; by default IndentedHelpFormatter is used.
162 parser : OptionParser
163 the controlling OptionParser instance
164 indent_increment : int
165 the number of columns to indent per nesting level
166 max_help_position : int
167 the maximum starting column for option help text
169 the calculated starting column for option help text;
170 initially the same as the maximum
172 total number of columns for output (pass None to constructor for
173 this value to be taken from the $COLUMNS environment variable)
175 current indentation level
177 current indentation level (in columns)
179 number of columns available for option help text (calculated)
181 text to replace with each option's default value, "%default"
182 by default. Set to false value to disable default value expansion.
183 option_strings : { Option : str }
184 maps Option instances to the snippet of help text explaining
185 the syntax of that option, e.g. "-h, --help" or
186 "-fFILE, --file=FILE"
188 format string controlling how short options with values are
189 printed in help text. Must be either "%s%s" ("-fFILE") or
190 "%s %s" ("-f FILE"), because those are the two syntaxes that
193 similar but for long options; must be either "%s %s" ("--file FILE")
194 or "%s=%s" ("--file=FILE").
197 NO_DEFAULT_VALUE
= "none"
205 self
.indent_increment
= indent_increment
206 self
.help_position
= self
.max_help_position
= max_help_position
209 width
= int(os
.environ
['COLUMNS'])
210 except (KeyError, ValueError):
214 self
.current_indent
= 0
216 self
.help_width
= None # computed later
217 self
.short_first
= short_first
218 self
.default_tag
= "%default"
219 self
.option_strings
= {}
220 self
._short
_opt
_fmt
= "%s %s"
221 self
._long
_opt
_fmt
= "%s=%s"
223 def set_parser(self
, parser
):
226 def set_short_opt_delimiter(self
, delim
):
227 if delim
not in ("", " "):
229 "invalid metavar delimiter for short options: %r" % delim
)
230 self
._short
_opt
_fmt
= "%s" + delim
+ "%s"
232 def set_long_opt_delimiter(self
, delim
):
233 if delim
not in ("=", " "):
235 "invalid metavar delimiter for long options: %r" % delim
)
236 self
._long
_opt
_fmt
= "%s" + delim
+ "%s"
239 self
.current_indent
+= self
.indent_increment
243 self
.current_indent
-= self
.indent_increment
244 assert self
.current_indent
>= 0, "Indent decreased below 0."
247 def format_usage(self
, usage
):
248 raise NotImplementedError("subclasses must implement")
250 def format_heading(self
, heading
):
251 raise NotImplementedError("subclasses must implement")
253 def _format_text(self
, text
):
255 Format a paragraph of free-form text for inclusion in the
256 help output at the current indentation level.
258 text_width
= self
.width
- self
.current_indent
259 indent
= " "*self
.current_indent
260 return textwrap
.fill(text
,
262 initial_indent
=indent
,
263 subsequent_indent
=indent
)
265 def format_description(self
, description
):
267 return self
._format
_text
(description
) + "\n"
271 def format_epilog(self
, epilog
):
273 return "\n" + self
._format
_text
(epilog
) + "\n"
278 def expand_default(self
, option
):
279 if self
.parser
is None or not self
.default_tag
:
282 default_value
= self
.parser
.defaults
.get(option
.dest
)
283 if default_value
is NO_DEFAULT
or default_value
is None:
284 default_value
= self
.NO_DEFAULT_VALUE
286 return option
.help.replace(self
.default_tag
, str(default_value
))
288 def format_option(self
, option
):
289 # The help for each option consists of two parts:
290 # * the opt strings and metavars
291 # eg. ("-x", or "-fFILENAME, --file=FILENAME")
292 # * the user-supplied help string
293 # eg. ("turn on expert mode", "read data from FILENAME")
295 # If possible, we write both of these on the same line:
296 # -x turn on expert mode
298 # But if the opt string list is too long, we put the help
299 # string on a second line, indented to the same column it would
300 # start in if it fit on the first line.
301 # -fFILENAME, --file=FILENAME
302 # read data from FILENAME
304 opts
= self
.option_strings
[option
]
305 opt_width
= self
.help_position
- self
.current_indent
- 2
306 if len(opts
) > opt_width
:
307 opts
= "%*s%s\n" % (self
.current_indent
, "", opts
)
308 indent_first
= self
.help_position
309 else: # start help on same line as opts
310 opts
= "%*s%-*s " % (self
.current_indent
, "", opt_width
, opts
)
314 help_text
= self
.expand_default(option
)
315 help_lines
= textwrap
.wrap(help_text
, self
.help_width
)
316 result
.append("%*s%s\n" % (indent_first
, "", help_lines
[0]))
317 result
.extend(["%*s%s\n" % (self
.help_position
, "", line
)
318 for line
in help_lines
[1:]])
319 elif opts
[-1] != "\n":
321 return "".join(result
)
323 def store_option_strings(self
, parser
):
326 for opt
in parser
.option_list
:
327 strings
= self
.format_option_strings(opt
)
328 self
.option_strings
[opt
] = strings
329 max_len
= max(max_len
, len(strings
) + self
.current_indent
)
331 for group
in parser
.option_groups
:
332 for opt
in group
.option_list
:
333 strings
= self
.format_option_strings(opt
)
334 self
.option_strings
[opt
] = strings
335 max_len
= max(max_len
, len(strings
) + self
.current_indent
)
338 self
.help_position
= min(max_len
+ 2, self
.max_help_position
)
339 self
.help_width
= self
.width
- self
.help_position
341 def format_option_strings(self
, option
):
342 """Return a comma-separated list of option strings & metavariables."""
343 if option
.takes_value():
344 metavar
= option
.metavar
or option
.dest
.upper()
345 short_opts
= [self
._short
_opt
_fmt
% (sopt
, metavar
)
346 for sopt
in option
._short
_opts
]
347 long_opts
= [self
._long
_opt
_fmt
% (lopt
, metavar
)
348 for lopt
in option
._long
_opts
]
350 short_opts
= option
._short
_opts
351 long_opts
= option
._long
_opts
354 opts
= short_opts
+ long_opts
356 opts
= long_opts
+ short_opts
358 return ", ".join(opts
)
360 class IndentedHelpFormatter (HelpFormatter
):
361 """Format help with indented section bodies.
366 max_help_position
=24,
369 HelpFormatter
.__init
__(
370 self
, indent_increment
, max_help_position
, width
, short_first
)
372 def format_usage(self
, usage
):
373 return _("Usage: %s\n") % usage
375 def format_heading(self
, heading
):
376 return "%*s%s:\n" % (self
.current_indent
, "", heading
)
379 class TitledHelpFormatter (HelpFormatter
):
380 """Format help with underlined section headers.
385 max_help_position
=24,
388 HelpFormatter
.__init
__ (
389 self
, indent_increment
, max_help_position
, width
, short_first
)
391 def format_usage(self
, usage
):
392 return "%s %s\n" % (self
.format_heading(_("Usage")), usage
)
394 def format_heading(self
, heading
):
395 return "%s\n%s\n" % (heading
, "=-"[self
.level
] * len(heading
))
398 def _parse_num(val
, type):
399 if val
[:2].lower() == "0x": # hexadecimal
401 elif val
[:2].lower() == "0b": # binary
403 val
= val
[2:] or "0" # have to remove "0b" prefix
404 elif val
[:1] == "0": # octal
409 return type(val
, radix
)
412 return _parse_num(val
, int)
414 def _parse_long(val
):
415 return _parse_num(val
, int)
417 _builtin_cvt
= { "int" : (_parse_int
, _("integer")),
418 "long" : (_parse_long
, _("long integer")),
419 "float" : (float, _("floating-point")),
420 "complex" : (complex, _("complex")) }
422 def check_builtin(option
, opt
, value
):
423 (cvt
, what
) = _builtin_cvt
[option
.type]
427 raise OptionValueError(
428 _("option %s: invalid %s value: %r") % (opt
, what
, value
))
430 def check_choice(option
, opt
, value
):
431 if value
in option
.choices
:
434 choices
= ", ".join(map(repr, option
.choices
))
435 raise OptionValueError(
436 _("option %s: invalid choice: %r (choose from %s)")
437 % (opt
, value
, choices
))
439 # Not supplying a default is different from a default of None,
440 # so we need an explicit "not supplied" value.
441 NO_DEFAULT
= ("NO", "DEFAULT")
447 _short_opts : [string]
448 _long_opts : [string]
458 callback_args : (any*)
459 callback_kwargs : { string : any }
464 # The list of instance attributes that may be set through
465 # keyword args to the constructor.
479 # The set of actions allowed by option parsers. Explicitly listed
480 # here so the constructor can validate its arguments.
492 # The set of actions that involve storing a value somewhere;
493 # also listed just for constructor argument validation. (If
494 # the action is one of these, there must be a destination.)
495 STORE_ACTIONS
= ("store",
503 # The set of actions for which it makes sense to supply a value
504 # type, ie. which may consume an argument from the command line.
505 TYPED_ACTIONS
= ("store",
509 # The set of actions which *require* a value type, ie. that
510 # always consume an argument from the command line.
511 ALWAYS_TYPED_ACTIONS
= ("store",
514 # The set of actions which take a 'const' attribute.
515 CONST_ACTIONS
= ("store_const",
518 # The set of known types for option parsers. Again, listed here for
519 # constructor argument validation.
520 TYPES
= ("string", "int", "long", "float", "complex", "choice")
522 # Dictionary of argument checking functions, which convert and
523 # validate option arguments according to the option type.
525 # Signature of checking functions is:
526 # check(option : Option, opt : string, value : string) -> any
528 # option is the Option instance calling the checker
529 # opt is the actual option seen on the command-line
530 # (eg. "-a", "--file")
531 # value is the option argument seen on the command-line
533 # The return value should be in the appropriate Python type
534 # for option.type -- eg. an integer if option.type == "int".
536 # If no checker is defined for a type, arguments will be
537 # unchecked and remain strings.
538 TYPE_CHECKER
= { "int" : check_builtin
,
539 "long" : check_builtin
,
540 "float" : check_builtin
,
541 "complex": check_builtin
,
542 "choice" : check_choice
,
546 # CHECK_METHODS is a list of unbound method objects; they are called
547 # by the constructor, in order, after all attributes are
548 # initialized. The list is created and filled in later, after all
549 # the methods are actually defined. (I just put it here because I
550 # like to define and document all class attributes in the same
551 # place.) Subclasses that add another _check_*() method should
552 # define their own CHECK_METHODS list that adds their check method
553 # to those from this class.
557 # -- Constructor/initialization methods ----------------------------
559 def __init__(self
, *opts
, **attrs
):
560 # Set _short_opts, _long_opts attrs from 'opts' tuple.
561 # Have to be set now, in case no option strings are supplied.
562 self
._short
_opts
= []
564 opts
= self
._check
_opt
_strings
(opts
)
565 self
._set
_opt
_strings
(opts
)
567 # Set all other attrs (action, type, etc.) from 'attrs' dict
568 self
._set
_attrs
(attrs
)
570 # Check all the attributes we just set. There are lots of
571 # complicated interdependencies, but luckily they can be farmed
572 # out to the _check_*() methods listed in CHECK_METHODS -- which
573 # could be handy for subclasses! The one thing these all share
574 # is that they raise OptionError if they discover a problem.
575 for checker
in self
.CHECK_METHODS
:
578 def _check_opt_strings(self
, opts
):
579 # Filter out None because early versions of Optik had exactly
580 # one short option and one long option, either of which
582 opts
= [opt
for opt
in opts
if opt
]
584 raise TypeError("at least one option string must be supplied")
587 def _set_opt_strings(self
, opts
):
591 "invalid option string %r: "
592 "must be at least two characters long" % opt
, self
)
594 if not (opt
[0] == "-" and opt
[1] != "-"):
596 "invalid short option string %r: "
597 "must be of the form -x, (x any non-dash char)" % opt
,
599 self
._short
_opts
.append(opt
)
601 if not (opt
[0:2] == "--" and opt
[2] != "-"):
603 "invalid long option string %r: "
604 "must start with --, followed by non-dash" % opt
,
606 self
._long
_opts
.append(opt
)
608 def _set_attrs(self
, attrs
):
609 for attr
in self
.ATTRS
:
611 setattr(self
, attr
, attrs
[attr
])
614 if attr
== 'default':
615 setattr(self
, attr
, NO_DEFAULT
)
617 setattr(self
, attr
, None)
619 attrs
= sorted(attrs
.keys())
621 "invalid keyword arguments: %s" % ", ".join(attrs
),
625 # -- Constructor validation methods --------------------------------
627 def _check_action(self
):
628 if self
.action
is None:
629 self
.action
= "store"
630 elif self
.action
not in self
.ACTIONS
:
631 raise OptionError("invalid action: %r" % self
.action
, self
)
633 def _check_type(self
):
634 if self
.type is None:
635 if self
.action
in self
.ALWAYS_TYPED_ACTIONS
:
636 if self
.choices
is not None:
637 # The "choices" attribute implies "choice" type.
640 # No type given? "string" is the most sensible default.
643 # Allow type objects or builtin type conversion functions
644 # (int, str, etc.) as an alternative to their names. (The
645 # complicated check of builtins is only necessary for
646 # Python 2.1 and earlier, and is short-circuited by the
647 # first check on modern Pythons.)
649 if ( isinstance(self
.type, type) or
650 (hasattr(self
.type, "__name__") and
651 getattr(builtins
, self
.type.__name
__, None) is self
.type) ):
652 self
.type = self
.type.__name
__
654 if self
.type == "str":
657 if self
.type not in self
.TYPES
:
658 raise OptionError("invalid option type: %r" % self
.type, self
)
659 if self
.action
not in self
.TYPED_ACTIONS
:
661 "must not supply a type for action %r" % self
.action
, self
)
663 def _check_choice(self
):
664 if self
.type == "choice":
665 if self
.choices
is None:
667 "must supply a list of choices for type 'choice'", self
)
668 elif not isinstance(self
.choices
, (tuple, list)):
670 "choices must be a list of strings ('%s' supplied)"
671 % str(type(self
.choices
)).split("'")[1], self
)
672 elif self
.choices
is not None:
674 "must not supply choices for type %r" % self
.type, self
)
676 def _check_dest(self
):
677 # No destination given, and we need one for this action. The
678 # self.type check is for callbacks that take a value.
679 takes_value
= (self
.action
in self
.STORE_ACTIONS
or
680 self
.type is not None)
681 if self
.dest
is None and takes_value
:
683 # Glean a destination from the first long option string,
684 # or from the first short option string if no long options.
686 # eg. "--foo-bar" -> "foo_bar"
687 self
.dest
= self
._long
_opts
[0][2:].replace('-', '_')
689 self
.dest
= self
._short
_opts
[0][1]
691 def _check_const(self
):
692 if self
.action
not in self
.CONST_ACTIONS
and self
.const
is not None:
694 "'const' must not be supplied for action %r" % self
.action
,
697 def _check_nargs(self
):
698 if self
.action
in self
.TYPED_ACTIONS
:
699 if self
.nargs
is None:
701 elif self
.nargs
is not None:
703 "'nargs' must not be supplied for action %r" % self
.action
,
706 def _check_callback(self
):
707 if self
.action
== "callback":
708 if not hasattr(self
.callback
, '__call__'):
710 "callback not callable: %r" % self
.callback
, self
)
711 if (self
.callback_args
is not None and
712 not isinstance(self
.callback_args
, tuple)):
714 "callback_args, if supplied, must be a tuple: not %r"
715 % self
.callback_args
, self
)
716 if (self
.callback_kwargs
is not None and
717 not isinstance(self
.callback_kwargs
, dict)):
719 "callback_kwargs, if supplied, must be a dict: not %r"
720 % self
.callback_kwargs
, self
)
722 if self
.callback
is not None:
724 "callback supplied (%r) for non-callback option"
725 % self
.callback
, self
)
726 if self
.callback_args
is not None:
728 "callback_args supplied for non-callback option", self
)
729 if self
.callback_kwargs
is not None:
731 "callback_kwargs supplied for non-callback option", self
)
734 CHECK_METHODS
= [_check_action
,
743 # -- Miscellaneous methods -----------------------------------------
746 return "/".join(self
._short
_opts
+ self
._long
_opts
)
750 def takes_value(self
):
751 return self
.type is not None
753 def get_opt_string(self
):
755 return self
._long
_opts
[0]
757 return self
._short
_opts
[0]
760 # -- Processing methods --------------------------------------------
762 def check_value(self
, opt
, value
):
763 checker
= self
.TYPE_CHECKER
.get(self
.type)
767 return checker(self
, opt
, value
)
769 def convert_value(self
, opt
, value
):
770 if value
is not None:
772 return self
.check_value(opt
, value
)
774 return tuple([self
.check_value(opt
, v
) for v
in value
])
776 def process(self
, opt
, value
, values
, parser
):
778 # First, convert the value(s) to the right type. Howl if any
779 # value(s) are bogus.
780 value
= self
.convert_value(opt
, value
)
782 # And then take whatever action is expected of us.
783 # This is a separate method to make life easier for
784 # subclasses to add new actions.
785 return self
.take_action(
786 self
.action
, self
.dest
, opt
, value
, values
, parser
)
788 def take_action(self
, action
, dest
, opt
, value
, values
, parser
):
789 if action
== "store":
790 setattr(values
, dest
, value
)
791 elif action
== "store_const":
792 setattr(values
, dest
, self
.const
)
793 elif action
== "store_true":
794 setattr(values
, dest
, True)
795 elif action
== "store_false":
796 setattr(values
, dest
, False)
797 elif action
== "append":
798 values
.ensure_value(dest
, []).append(value
)
799 elif action
== "append_const":
800 values
.ensure_value(dest
, []).append(self
.const
)
801 elif action
== "count":
802 setattr(values
, dest
, values
.ensure_value(dest
, 0) + 1)
803 elif action
== "callback":
804 args
= self
.callback_args
or ()
805 kwargs
= self
.callback_kwargs
or {}
806 self
.callback(self
, opt
, value
, parser
, *args
, **kwargs
)
807 elif action
== "help":
810 elif action
== "version":
811 parser
.print_version()
814 raise ValueError("unknown action %r" % self
.action
)
821 SUPPRESS_HELP
= "SUPPRESS"+"HELP"
822 SUPPRESS_USAGE
= "SUPPRESS"+"USAGE"
826 def __init__(self
, defaults
=None):
828 for (attr
, val
) in defaults
.items():
829 setattr(self
, attr
, val
)
832 return str(self
.__dict
__)
836 def __eq__(self
, other
):
837 if isinstance(other
, Values
):
838 return self
.__dict
__ == other
.__dict
__
839 elif isinstance(other
, dict):
840 return self
.__dict
__ == other
842 return NotImplemented
844 def _update_careful(self
, dict):
846 Update the option values from an arbitrary dictionary, but only
847 use keys from dict that already have a corresponding attribute
848 in self. Any keys in dict without a corresponding attribute
849 are silently ignored.
851 for attr
in dir(self
):
855 setattr(self
, attr
, dval
)
857 def _update_loose(self
, dict):
859 Update the option values from an arbitrary dictionary,
860 using all keys from the dictionary regardless of whether
861 they have a corresponding attribute in self or not.
863 self
.__dict
__.update(dict)
865 def _update(self
, dict, mode
):
866 if mode
== "careful":
867 self
._update
_careful
(dict)
868 elif mode
== "loose":
869 self
._update
_loose
(dict)
871 raise ValueError("invalid update mode: %r" % mode
)
873 def read_module(self
, modname
, mode
="careful"):
875 mod
= sys
.modules
[modname
]
876 self
._update
(vars(mod
), mode
)
878 def read_file(self
, filename
, mode
="careful"):
880 exec(open(filename
).read(), vars)
881 self
._update
(vars, mode
)
883 def ensure_value(self
, attr
, value
):
884 if not hasattr(self
, attr
) or getattr(self
, attr
) is None:
885 setattr(self
, attr
, value
)
886 return getattr(self
, attr
)
889 class OptionContainer
:
895 standard_option_list : [Option]
896 list of standard options that will be accepted by all instances
897 of this parser class (intended to be overridden by subclasses).
900 option_list : [Option]
901 the list of Option objects contained by this OptionContainer
902 _short_opt : { string : Option }
903 dictionary mapping short option strings, eg. "-f" or "-X",
904 to the Option instances that implement them. If an Option
905 has multiple short option strings, it will appears in this
906 dictionary multiple times. [1]
907 _long_opt : { string : Option }
908 dictionary mapping long option strings, eg. "--file" or
909 "--exclude", to the Option instances that implement them.
910 Again, a given Option can occur multiple times in this
912 defaults : { string : any }
913 dictionary mapping option destination names to default
914 values for each destination [1]
916 [1] These mappings are common to (shared by) all components of the
917 controlling OptionParser, where they are initially created.
921 def __init__(self
, option_class
, conflict_handler
, description
):
922 # Initialize the option list and related data structures.
923 # This method must be provided by subclasses, and it must
924 # initialize at least the following instance attributes:
925 # option_list, _short_opt, _long_opt, defaults.
926 self
._create
_option
_list
()
928 self
.option_class
= option_class
929 self
.set_conflict_handler(conflict_handler
)
930 self
.set_description(description
)
932 def _create_option_mappings(self
):
933 # For use by OptionParser constructor -- create the master
934 # option mappings used by this OptionParser and all
935 # OptionGroups that it owns.
936 self
._short
_opt
= {} # single letter -> Option instance
937 self
._long
_opt
= {} # long option -> Option instance
938 self
.defaults
= {} # maps option dest -> default value
941 def _share_option_mappings(self
, parser
):
942 # For use by OptionGroup constructor -- use shared option
943 # mappings from the OptionParser that owns this OptionGroup.
944 self
._short
_opt
= parser
._short
_opt
945 self
._long
_opt
= parser
._long
_opt
946 self
.defaults
= parser
.defaults
948 def set_conflict_handler(self
, handler
):
949 if handler
not in ("error", "resolve"):
950 raise ValueError("invalid conflict_resolution value %r" % handler
)
951 self
.conflict_handler
= handler
953 def set_description(self
, description
):
954 self
.description
= description
956 def get_description(self
):
957 return self
.description
961 """see OptionParser.destroy()."""
967 # -- Option-adding methods -----------------------------------------
969 def _check_conflict(self
, option
):
971 for opt
in option
._short
_opts
:
972 if opt
in self
._short
_opt
:
973 conflict_opts
.append((opt
, self
._short
_opt
[opt
]))
974 for opt
in option
._long
_opts
:
975 if opt
in self
._long
_opt
:
976 conflict_opts
.append((opt
, self
._long
_opt
[opt
]))
979 handler
= self
.conflict_handler
980 if handler
== "error":
981 raise OptionConflictError(
982 "conflicting option string(s): %s"
983 % ", ".join([co
[0] for co
in conflict_opts
]),
985 elif handler
== "resolve":
986 for (opt
, c_option
) in conflict_opts
:
987 if opt
.startswith("--"):
988 c_option
._long
_opts
.remove(opt
)
989 del self
._long
_opt
[opt
]
991 c_option
._short
_opts
.remove(opt
)
992 del self
._short
_opt
[opt
]
993 if not (c_option
._short
_opts
or c_option
._long
_opts
):
994 c_option
.container
.option_list
.remove(c_option
)
996 def add_option(self
, *args
, **kwargs
):
997 """add_option(Option)
998 add_option(opt_str, ..., kwarg=val, ...)
1000 if isinstance(args
[0], str):
1001 option
= self
.option_class(*args
, **kwargs
)
1002 elif len(args
) == 1 and not kwargs
:
1004 if not isinstance(option
, Option
):
1005 raise TypeError("not an Option instance: %r" % option
)
1007 raise TypeError("invalid arguments")
1009 self
._check
_conflict
(option
)
1011 self
.option_list
.append(option
)
1012 option
.container
= self
1013 for opt
in option
._short
_opts
:
1014 self
._short
_opt
[opt
] = option
1015 for opt
in option
._long
_opts
:
1016 self
._long
_opt
[opt
] = option
1018 if option
.dest
is not None: # option has a dest, we need a default
1019 if option
.default
is not NO_DEFAULT
:
1020 self
.defaults
[option
.dest
] = option
.default
1021 elif option
.dest
not in self
.defaults
:
1022 self
.defaults
[option
.dest
] = None
1026 def add_options(self
, option_list
):
1027 for option
in option_list
:
1028 self
.add_option(option
)
1030 # -- Option query/removal methods ----------------------------------
1032 def get_option(self
, opt_str
):
1033 return (self
._short
_opt
.get(opt_str
) or
1034 self
._long
_opt
.get(opt_str
))
1036 def has_option(self
, opt_str
):
1037 return (opt_str
in self
._short
_opt
or
1038 opt_str
in self
._long
_opt
)
1040 def remove_option(self
, opt_str
):
1041 option
= self
._short
_opt
.get(opt_str
)
1043 option
= self
._long
_opt
.get(opt_str
)
1045 raise ValueError("no such option %r" % opt_str
)
1047 for opt
in option
._short
_opts
:
1048 del self
._short
_opt
[opt
]
1049 for opt
in option
._long
_opts
:
1050 del self
._long
_opt
[opt
]
1051 option
.container
.option_list
.remove(option
)
1054 # -- Help-formatting methods ---------------------------------------
1056 def format_option_help(self
, formatter
):
1057 if not self
.option_list
:
1060 for option
in self
.option_list
:
1061 if not option
.help is SUPPRESS_HELP
:
1062 result
.append(formatter
.format_option(option
))
1063 return "".join(result
)
1065 def format_description(self
, formatter
):
1066 return formatter
.format_description(self
.get_description())
1068 def format_help(self
, formatter
):
1070 if self
.description
:
1071 result
.append(self
.format_description(formatter
))
1072 if self
.option_list
:
1073 result
.append(self
.format_option_help(formatter
))
1074 return "\n".join(result
)
1077 class OptionGroup (OptionContainer
):
1079 def __init__(self
, parser
, title
, description
=None):
1080 self
.parser
= parser
1081 OptionContainer
.__init
__(
1082 self
, parser
.option_class
, parser
.conflict_handler
, description
)
1085 def _create_option_list(self
):
1086 self
.option_list
= []
1087 self
._share
_option
_mappings
(self
.parser
)
1089 def set_title(self
, title
):
1093 """see OptionParser.destroy()."""
1094 OptionContainer
.destroy(self
)
1095 del self
.option_list
1097 # -- Help-formatting methods ---------------------------------------
1099 def format_help(self
, formatter
):
1100 result
= formatter
.format_heading(self
.title
)
1102 result
+= OptionContainer
.format_help(self
, formatter
)
1107 class OptionParser (OptionContainer
):
1111 standard_option_list : [Option]
1112 list of standard options that will be accepted by all instances
1113 of this parser class (intended to be overridden by subclasses).
1115 Instance attributes:
1117 a usage string for your program. Before it is displayed
1118 to the user, "%prog" will be expanded to the name of
1119 your program (self.prog or os.path.basename(sys.argv[0])).
1121 the name of the current program (to override
1122 os.path.basename(sys.argv[0])).
1124 paragraph of help text to print after option help
1126 option_groups : [OptionGroup]
1127 list of option groups in this parser (option groups are
1128 irrelevant for parsing the command-line, but very useful
1129 for generating help)
1131 allow_interspersed_args : bool = true
1132 if true, positional arguments may be interspersed with options.
1133 Assuming -a and -b each take a single argument, the command-line
1134 -ablah foo bar -bboo baz
1135 will be interpreted the same as
1136 -ablah -bboo -- foo bar baz
1137 If this flag were false, that command line would be interpreted as
1138 -ablah -- foo bar -bboo baz
1139 -- ie. we stop processing options as soon as we see the first
1140 non-option argument. (This is the tradition followed by
1141 Python's getopt module, Perl's Getopt::Std, and other argument-
1142 parsing libraries, but it is generally annoying to users.)
1144 process_default_values : bool = true
1145 if true, option default values are processed similarly to option
1146 values from the command line: that is, they are passed to the
1147 type-checking function for the option's type (as long as the
1148 default value is a string). (This really only matters if you
1149 have defined custom types; see SF bug #955889.) Set it to false
1150 to restore the behaviour of Optik 1.4.1 and earlier.
1153 the argument list currently being parsed. Only set when
1154 parse_args() is active, and continually trimmed down as
1155 we consume arguments. Mainly there for the benefit of
1158 the list of leftover arguments that we have skipped while
1159 parsing options. If allow_interspersed_args is false, this
1160 list is always empty.
1162 the set of option values currently being accumulated. Only
1163 set when parse_args() is active. Also mainly for callbacks.
1165 Because of the 'rargs', 'largs', and 'values' attributes,
1166 OptionParser is not thread-safe. If, for some perverse reason, you
1167 need to parse command-line arguments simultaneously in different
1168 threads, use different OptionParser instances.
1172 standard_option_list
= []
1177 option_class
=Option
,
1179 conflict_handler
="error",
1182 add_help_option
=True,
1185 OptionContainer
.__init
__(
1186 self
, option_class
, conflict_handler
, description
)
1187 self
.set_usage(usage
)
1189 self
.version
= version
1190 self
.allow_interspersed_args
= True
1191 self
.process_default_values
= True
1192 if formatter
is None:
1193 formatter
= IndentedHelpFormatter()
1194 self
.formatter
= formatter
1195 self
.formatter
.set_parser(self
)
1196 self
.epilog
= epilog
1198 # Populate the option list; initial sources are the
1199 # standard_option_list class attribute, the 'option_list'
1200 # argument, and (if applicable) the _add_version_option() and
1201 # _add_help_option() methods.
1202 self
._populate
_option
_list
(option_list
,
1203 add_help
=add_help_option
)
1205 self
._init
_parsing
_state
()
1210 Declare that you are done with this OptionParser. This cleans up
1211 reference cycles so the OptionParser (and all objects referenced by
1212 it) can be garbage-collected promptly. After calling destroy(), the
1213 OptionParser is unusable.
1215 OptionContainer
.destroy(self
)
1216 for group
in self
.option_groups
:
1218 del self
.option_list
1219 del self
.option_groups
1223 # -- Private methods -----------------------------------------------
1224 # (used by our or OptionContainer's constructor)
1226 def _create_option_list(self
):
1227 self
.option_list
= []
1228 self
.option_groups
= []
1229 self
._create
_option
_mappings
()
1231 def _add_help_option(self
):
1232 self
.add_option("-h", "--help",
1234 help=_("show this help message and exit"))
1236 def _add_version_option(self
):
1237 self
.add_option("--version",
1239 help=_("show program's version number and exit"))
1241 def _populate_option_list(self
, option_list
, add_help
=True):
1242 if self
.standard_option_list
:
1243 self
.add_options(self
.standard_option_list
)
1245 self
.add_options(option_list
)
1247 self
._add
_version
_option
()
1249 self
._add
_help
_option
()
1251 def _init_parsing_state(self
):
1252 # These are set in parse_args() for the convenience of callbacks.
1258 # -- Simple modifier methods ---------------------------------------
1260 def set_usage(self
, usage
):
1262 self
.usage
= _("%prog [options]")
1263 elif usage
is SUPPRESS_USAGE
:
1265 # For backwards compatibility with Optik 1.3 and earlier.
1266 elif usage
.lower().startswith("usage: "):
1267 self
.usage
= usage
[7:]
1271 def enable_interspersed_args(self
):
1272 """Set parsing to not stop on the first non-option, allowing
1273 interspersing switches with command arguments. This is the
1274 default behavior. See also disable_interspersed_args() and the
1275 class documentation description of the attribute
1276 allow_interspersed_args."""
1277 self
.allow_interspersed_args
= True
1279 def disable_interspersed_args(self
):
1280 """Set parsing to stop on the first non-option. Use this if
1281 you have a command processor which runs another command that
1282 has options of its own and you want to make sure these options
1285 self
.allow_interspersed_args
= False
1287 def set_process_default_values(self
, process
):
1288 self
.process_default_values
= process
1290 def set_default(self
, dest
, value
):
1291 self
.defaults
[dest
] = value
1293 def set_defaults(self
, **kwargs
):
1294 self
.defaults
.update(kwargs
)
1296 def _get_all_options(self
):
1297 options
= self
.option_list
[:]
1298 for group
in self
.option_groups
:
1299 options
.extend(group
.option_list
)
1302 def get_default_values(self
):
1303 if not self
.process_default_values
:
1304 # Old, pre-Optik 1.5 behaviour.
1305 return Values(self
.defaults
)
1307 defaults
= self
.defaults
.copy()
1308 for option
in self
._get
_all
_options
():
1309 default
= defaults
.get(option
.dest
)
1310 if isinstance(default
, str):
1311 opt_str
= option
.get_opt_string()
1312 defaults
[option
.dest
] = option
.check_value(opt_str
, default
)
1314 return Values(defaults
)
1317 # -- OptionGroup methods -------------------------------------------
1319 def add_option_group(self
, *args
, **kwargs
):
1320 # XXX lots of overlap with OptionContainer.add_option()
1321 if isinstance(args
[0], str):
1322 group
= OptionGroup(self
, *args
, **kwargs
)
1323 elif len(args
) == 1 and not kwargs
:
1325 if not isinstance(group
, OptionGroup
):
1326 raise TypeError("not an OptionGroup instance: %r" % group
)
1327 if group
.parser
is not self
:
1328 raise ValueError("invalid OptionGroup (wrong parser)")
1330 raise TypeError("invalid arguments")
1332 self
.option_groups
.append(group
)
1335 def get_option_group(self
, opt_str
):
1336 option
= (self
._short
_opt
.get(opt_str
) or
1337 self
._long
_opt
.get(opt_str
))
1338 if option
and option
.container
is not self
:
1339 return option
.container
1343 # -- Option-parsing methods ----------------------------------------
1345 def _get_args(self
, args
):
1349 return args
[:] # don't modify caller's list
1351 def parse_args(self
, args
=None, values
=None):
1353 parse_args(args : [string] = sys.argv[1:],
1354 values : Values = None)
1355 -> (values : Values, args : [string])
1357 Parse the command-line options found in 'args' (default:
1358 sys.argv[1:]). Any errors result in a call to 'error()', which
1359 by default prints the usage message to stderr and calls
1360 sys.exit() with an error message. On success returns a pair
1361 (values, args) where 'values' is an Values instance (with all
1362 your option values) and 'args' is the list of arguments left
1363 over after parsing options.
1365 rargs
= self
._get
_args
(args
)
1367 values
= self
.get_default_values()
1369 # Store the halves of the argument list as attributes for the
1370 # convenience of callbacks:
1372 # the rest of the command-line (the "r" stands for
1373 # "remaining" or "right-hand")
1375 # the leftover arguments -- ie. what's left after removing
1376 # options and their arguments (the "l" stands for "leftover"
1379 self
.largs
= largs
= []
1380 self
.values
= values
1383 stop
= self
._process
_args
(largs
, rargs
, values
)
1384 except (BadOptionError
, OptionValueError
) as err
:
1385 self
.error(str(err
))
1387 args
= largs
+ rargs
1388 return self
.check_values(values
, args
)
1390 def check_values(self
, values
, args
):
1392 check_values(values : Values, args : [string])
1393 -> (values : Values, args : [string])
1395 Check that the supplied option values and leftover arguments are
1396 valid. Returns the option values and leftover arguments
1397 (possibly adjusted, possibly completely new -- whatever you
1398 like). Default implementation just returns the passed-in
1399 values; subclasses may override as desired.
1401 return (values
, args
)
1403 def _process_args(self
, largs
, rargs
, values
):
1404 """_process_args(largs : [string],
1408 Process command-line arguments and populate 'values', consuming
1409 options and arguments from 'rargs'. If 'allow_interspersed_args' is
1410 false, stop at the first non-option argument. If true, accumulate any
1411 interspersed non-option arguments in 'largs'.
1415 # We handle bare "--" explicitly, and bare "-" is handled by the
1416 # standard arg handler since the short arg case ensures that the
1417 # len of the opt string is greater than 1.
1421 elif arg
[0:2] == "--":
1422 # process a single long option (possibly with value(s))
1423 self
._process
_long
_opt
(rargs
, values
)
1424 elif arg
[:1] == "-" and len(arg
) > 1:
1425 # process a cluster of short options (possibly with
1426 # value(s) for the last one only)
1427 self
._process
_short
_opts
(rargs
, values
)
1428 elif self
.allow_interspersed_args
:
1432 return # stop now, leave this arg in rargs
1434 # Say this is the original argument list:
1435 # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)]
1437 # (we are about to process arg(i)).
1439 # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of
1440 # [arg0, ..., arg(i-1)] (any options and their arguments will have
1441 # been removed from largs).
1443 # The while loop will usually consume 1 or more arguments per pass.
1444 # If it consumes 1 (eg. arg is an option that takes no arguments),
1445 # then after _process_arg() is done the situation is:
1447 # largs = subset of [arg0, ..., arg(i)]
1448 # rargs = [arg(i+1), ..., arg(N-1)]
1450 # If allow_interspersed_args is false, largs will always be
1451 # *empty* -- still a subset of [arg0, ..., arg(i-1)], but
1452 # not a very interesting subset!
1454 def _match_long_opt(self
, opt
):
1455 """_match_long_opt(opt : string) -> string
1457 Determine which long option string 'opt' matches, ie. which one
1458 it is an unambiguous abbrevation for. Raises BadOptionError if
1459 'opt' doesn't unambiguously match any long option string.
1461 return _match_abbrev(opt
, self
._long
_opt
)
1463 def _process_long_opt(self
, rargs
, values
):
1466 # Value explicitly attached to arg? Pretend it's the next
1469 (opt
, next_arg
) = arg
.split("=", 1)
1470 rargs
.insert(0, next_arg
)
1471 had_explicit_value
= True
1474 had_explicit_value
= False
1476 opt
= self
._match
_long
_opt
(opt
)
1477 option
= self
._long
_opt
[opt
]
1478 if option
.takes_value():
1479 nargs
= option
.nargs
1480 if len(rargs
) < nargs
:
1482 self
.error(_("%s option requires an argument") % opt
)
1484 self
.error(_("%s option requires %d arguments")
1487 value
= rargs
.pop(0)
1489 value
= tuple(rargs
[0:nargs
])
1492 elif had_explicit_value
:
1493 self
.error(_("%s option does not take a value") % opt
)
1498 option
.process(opt
, value
, values
, self
)
1500 def _process_short_opts(self
, rargs
, values
):
1506 option
= self
._short
_opt
.get(opt
)
1507 i
+= 1 # we have consumed a character
1510 raise BadOptionError(opt
)
1511 if option
.takes_value():
1512 # Any characters left in arg? Pretend they're the
1513 # next arg, and stop consuming characters of arg.
1515 rargs
.insert(0, arg
[i
:])
1518 nargs
= option
.nargs
1519 if len(rargs
) < nargs
:
1521 self
.error(_("%s option requires an argument") % opt
)
1523 self
.error(_("%s option requires %d arguments")
1526 value
= rargs
.pop(0)
1528 value
= tuple(rargs
[0:nargs
])
1531 else: # option doesn't take a value
1534 option
.process(opt
, value
, values
, self
)
1540 # -- Feedback methods ----------------------------------------------
1542 def get_prog_name(self
):
1543 if self
.prog
is None:
1544 return os
.path
.basename(sys
.argv
[0])
1548 def expand_prog_name(self
, s
):
1549 return s
.replace("%prog", self
.get_prog_name())
1551 def get_description(self
):
1552 return self
.expand_prog_name(self
.description
)
1554 def exit(self
, status
=0, msg
=None):
1556 sys
.stderr
.write(msg
)
1559 def error(self
, msg
):
1560 """error(msg : string)
1562 Print a usage message incorporating 'msg' to stderr and exit.
1563 If you override this in a subclass, it should not return -- it
1564 should either exit or raise an exception.
1566 self
.print_usage(sys
.stderr
)
1567 self
.exit(2, "%s: error: %s\n" % (self
.get_prog_name(), msg
))
1569 def get_usage(self
):
1571 return self
.formatter
.format_usage(
1572 self
.expand_prog_name(self
.usage
))
1576 def print_usage(self
, file=None):
1577 """print_usage(file : file = stdout)
1579 Print the usage message for the current program (self.usage) to
1580 'file' (default stdout). Any occurrence of the string "%prog" in
1581 self.usage is replaced with the name of the current program
1582 (basename of sys.argv[0]). Does nothing if self.usage is empty
1586 print(self
.get_usage(), file=file)
1588 def get_version(self
):
1590 return self
.expand_prog_name(self
.version
)
1594 def print_version(self
, file=None):
1595 """print_version(file : file = stdout)
1597 Print the version message for this program (self.version) to
1598 'file' (default stdout). As with print_usage(), any occurrence
1599 of "%prog" in self.version is replaced by the current program's
1600 name. Does nothing if self.version is empty or undefined.
1603 print(self
.get_version(), file=file)
1605 def format_option_help(self
, formatter
=None):
1606 if formatter
is None:
1607 formatter
= self
.formatter
1608 formatter
.store_option_strings(self
)
1610 result
.append(formatter
.format_heading(_("Options")))
1612 if self
.option_list
:
1613 result
.append(OptionContainer
.format_option_help(self
, formatter
))
1615 for group
in self
.option_groups
:
1616 result
.append(group
.format_help(formatter
))
1619 # Drop the last "\n", or the header if no options or option groups:
1620 return "".join(result
[:-1])
1622 def format_epilog(self
, formatter
):
1623 return formatter
.format_epilog(self
.epilog
)
1625 def format_help(self
, formatter
=None):
1626 if formatter
is None:
1627 formatter
= self
.formatter
1630 result
.append(self
.get_usage() + "\n")
1631 if self
.description
:
1632 result
.append(self
.format_description(formatter
) + "\n")
1633 result
.append(self
.format_option_help(formatter
))
1634 result
.append(self
.format_epilog(formatter
))
1635 return "".join(result
)
1637 def print_help(self
, file=None):
1638 """print_help(file : file = stdout)
1640 Print an extended help message, listing all options and any
1641 help text provided with them, to 'file' (default stdout).
1645 file.write(self
.format_help())
1647 # class OptionParser
1650 def _match_abbrev(s
, wordmap
):
1651 """_match_abbrev(s : string, wordmap : {string : Option}) -> string
1653 Return the string key in 'wordmap' for which 's' is an unambiguous
1654 abbreviation. If 's' is found to be ambiguous or doesn't match any of
1655 'words', raise BadOptionError.
1657 # Is there an exact match?
1661 # Isolate all words with s as a prefix.
1662 possibilities
= [word
for word
in wordmap
.keys()
1663 if word
.startswith(s
)]
1664 # No exact match, so there had better be just one possibility.
1665 if len(possibilities
) == 1:
1666 return possibilities
[0]
1667 elif not possibilities
:
1668 raise BadOptionError(s
)
1670 # More than one possible completion: ambiguous prefix.
1671 possibilities
.sort()
1672 raise AmbiguousOptionError(s
, possibilities
)
1675 # Some day, there might be many Option classes. As of Optik 1.3, the
1676 # preferred way to instantiate Options is indirectly, via make_option(),
1677 # which will become a factory function when there are many Option
1679 make_option
= Option