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.
80 return "<%s at 0x%x: %s>" % (self
.__class
__.__name
__, id(self
), self
)
83 # This file was generated from:
84 # Id: option_parser.py 527 2006-07-23 15:21:30Z greg
85 # Id: option.py 522 2006-06-11 16:22:03Z gward
86 # Id: help.py 527 2006-07-23 15:21:30Z greg
87 # Id: errors.py 509 2006-04-20 00:58:24Z gward
90 from gettext
import gettext
97 class OptParseError (Exception):
98 def __init__(self
, msg
):
105 class OptionError (OptParseError
):
107 Raised if an Option instance is created with invalid or
108 inconsistent arguments.
111 def __init__(self
, msg
, option
):
113 self
.option_id
= str(option
)
117 return "option %s: %s" % (self
.option_id
, self
.msg
)
121 class OptionConflictError (OptionError
):
123 Raised if conflicting options are added to an OptionParser.
126 class OptionValueError (OptParseError
):
128 Raised if an invalid option value is encountered on the command
132 class BadOptionError (OptParseError
):
134 Raised if an invalid option is seen on the command line.
136 def __init__(self
, opt_str
):
137 self
.opt_str
= opt_str
140 return _("no such option: %s") % self
.opt_str
142 class AmbiguousOptionError (BadOptionError
):
144 Raised if an ambiguous option is seen on the command line.
146 def __init__(self
, opt_str
, possibilities
):
147 BadOptionError
.__init
__(self
, opt_str
)
148 self
.possibilities
= possibilities
151 return (_("ambiguous option: %s (%s?)")
152 % (self
.opt_str
, ", ".join(self
.possibilities
)))
158 Abstract base class for formatting option help. OptionParser
159 instances should use one of the HelpFormatter subclasses for
160 formatting help; by default IndentedHelpFormatter is used.
163 parser : OptionParser
164 the controlling OptionParser instance
165 indent_increment : int
166 the number of columns to indent per nesting level
167 max_help_position : int
168 the maximum starting column for option help text
170 the calculated starting column for option help text;
171 initially the same as the maximum
173 total number of columns for output (pass None to constructor for
174 this value to be taken from the $COLUMNS environment variable)
176 current indentation level
178 current indentation level (in columns)
180 number of columns available for option help text (calculated)
182 text to replace with each option's default value, "%default"
183 by default. Set to false value to disable default value expansion.
184 option_strings : { Option : str }
185 maps Option instances to the snippet of help text explaining
186 the syntax of that option, e.g. "-h, --help" or
187 "-fFILE, --file=FILE"
189 format string controlling how short options with values are
190 printed in help text. Must be either "%s%s" ("-fFILE") or
191 "%s %s" ("-f FILE"), because those are the two syntaxes that
194 similar but for long options; must be either "%s %s" ("--file FILE")
195 or "%s=%s" ("--file=FILE").
198 NO_DEFAULT_VALUE
= "none"
206 self
.indent_increment
= indent_increment
207 self
.help_position
= self
.max_help_position
= max_help_position
210 width
= int(os
.environ
['COLUMNS'])
211 except (KeyError, ValueError):
215 self
.current_indent
= 0
217 self
.help_width
= None # computed later
218 self
.short_first
= short_first
219 self
.default_tag
= "%default"
220 self
.option_strings
= {}
221 self
._short
_opt
_fmt
= "%s %s"
222 self
._long
_opt
_fmt
= "%s=%s"
224 def set_parser(self
, parser
):
227 def set_short_opt_delimiter(self
, delim
):
228 if delim
not in ("", " "):
230 "invalid metavar delimiter for short options: %r" % delim
)
231 self
._short
_opt
_fmt
= "%s" + delim
+ "%s"
233 def set_long_opt_delimiter(self
, delim
):
234 if delim
not in ("=", " "):
236 "invalid metavar delimiter for long options: %r" % delim
)
237 self
._long
_opt
_fmt
= "%s" + delim
+ "%s"
240 self
.current_indent
+= self
.indent_increment
244 self
.current_indent
-= self
.indent_increment
245 assert self
.current_indent
>= 0, "Indent decreased below 0."
248 def format_usage(self
, usage
):
249 raise NotImplementedError, "subclasses must implement"
251 def format_heading(self
, heading
):
252 raise NotImplementedError, "subclasses must implement"
254 def _format_text(self
, text
):
256 Format a paragraph of free-form text for inclusion in the
257 help output at the current indentation level.
259 text_width
= self
.width
- self
.current_indent
260 indent
= " "*self
.current_indent
261 return textwrap
.fill(text
,
263 initial_indent
=indent
,
264 subsequent_indent
=indent
)
266 def format_description(self
, description
):
268 return self
._format
_text
(description
) + "\n"
272 def format_epilog(self
, epilog
):
274 return "\n" + self
._format
_text
(epilog
) + "\n"
279 def expand_default(self
, option
):
280 if self
.parser
is None or not self
.default_tag
:
283 default_value
= self
.parser
.defaults
.get(option
.dest
)
284 if default_value
is NO_DEFAULT
or default_value
is None:
285 default_value
= self
.NO_DEFAULT_VALUE
287 return option
.help.replace(self
.default_tag
, str(default_value
))
289 def format_option(self
, option
):
290 # The help for each option consists of two parts:
291 # * the opt strings and metavars
292 # eg. ("-x", or "-fFILENAME, --file=FILENAME")
293 # * the user-supplied help string
294 # eg. ("turn on expert mode", "read data from FILENAME")
296 # If possible, we write both of these on the same line:
297 # -x turn on expert mode
299 # But if the opt string list is too long, we put the help
300 # string on a second line, indented to the same column it would
301 # start in if it fit on the first line.
302 # -fFILENAME, --file=FILENAME
303 # read data from FILENAME
305 opts
= self
.option_strings
[option
]
306 opt_width
= self
.help_position
- self
.current_indent
- 2
307 if len(opts
) > opt_width
:
308 opts
= "%*s%s\n" % (self
.current_indent
, "", opts
)
309 indent_first
= self
.help_position
310 else: # start help on same line as opts
311 opts
= "%*s%-*s " % (self
.current_indent
, "", opt_width
, opts
)
315 help_text
= self
.expand_default(option
)
316 help_lines
= textwrap
.wrap(help_text
, self
.help_width
)
317 result
.append("%*s%s\n" % (indent_first
, "", help_lines
[0]))
318 result
.extend(["%*s%s\n" % (self
.help_position
, "", line
)
319 for line
in help_lines
[1:]])
320 elif opts
[-1] != "\n":
322 return "".join(result
)
324 def store_option_strings(self
, parser
):
327 for opt
in parser
.option_list
:
328 strings
= self
.format_option_strings(opt
)
329 self
.option_strings
[opt
] = strings
330 max_len
= max(max_len
, len(strings
) + self
.current_indent
)
332 for group
in parser
.option_groups
:
333 for opt
in group
.option_list
:
334 strings
= self
.format_option_strings(opt
)
335 self
.option_strings
[opt
] = strings
336 max_len
= max(max_len
, len(strings
) + self
.current_indent
)
339 self
.help_position
= min(max_len
+ 2, self
.max_help_position
)
340 self
.help_width
= self
.width
- self
.help_position
342 def format_option_strings(self
, option
):
343 """Return a comma-separated list of option strings & metavariables."""
344 if option
.takes_value():
345 metavar
= option
.metavar
or option
.dest
.upper()
346 short_opts
= [self
._short
_opt
_fmt
% (sopt
, metavar
)
347 for sopt
in option
._short
_opts
]
348 long_opts
= [self
._long
_opt
_fmt
% (lopt
, metavar
)
349 for lopt
in option
._long
_opts
]
351 short_opts
= option
._short
_opts
352 long_opts
= option
._long
_opts
355 opts
= short_opts
+ long_opts
357 opts
= long_opts
+ short_opts
359 return ", ".join(opts
)
361 class IndentedHelpFormatter (HelpFormatter
):
362 """Format help with indented section bodies.
367 max_help_position
=24,
370 HelpFormatter
.__init
__(
371 self
, indent_increment
, max_help_position
, width
, short_first
)
373 def format_usage(self
, usage
):
374 return _("Usage: %s\n") % usage
376 def format_heading(self
, heading
):
377 return "%*s%s:\n" % (self
.current_indent
, "", heading
)
380 class TitledHelpFormatter (HelpFormatter
):
381 """Format help with underlined section headers.
386 max_help_position
=24,
389 HelpFormatter
.__init
__ (
390 self
, indent_increment
, max_help_position
, width
, short_first
)
392 def format_usage(self
, usage
):
393 return "%s %s\n" % (self
.format_heading(_("Usage")), usage
)
395 def format_heading(self
, heading
):
396 return "%s\n%s\n" % (heading
, "=-"[self
.level
] * len(heading
))
399 def _parse_num(val
, type):
400 if val
[:2].lower() == "0x": # hexadecimal
402 elif val
[:2].lower() == "0b": # binary
404 val
= val
[2:] or "0" # have to remove "0b" prefix
405 elif val
[:1] == "0": # octal
410 return type(val
, radix
)
413 return _parse_num(val
, int)
415 def _parse_long(val
):
416 return _parse_num(val
, long)
418 _builtin_cvt
= { "int" : (_parse_int
, _("integer")),
419 "long" : (_parse_long
, _("long integer")),
420 "float" : (float, _("floating-point")),
421 "complex" : (complex, _("complex")) }
423 def check_builtin(option
, opt
, value
):
424 (cvt
, what
) = _builtin_cvt
[option
.type]
428 raise OptionValueError(
429 _("option %s: invalid %s value: %r") % (opt
, what
, value
))
431 def check_choice(option
, opt
, value
):
432 if value
in option
.choices
:
435 choices
= ", ".join(map(repr, option
.choices
))
436 raise OptionValueError(
437 _("option %s: invalid choice: %r (choose from %s)")
438 % (opt
, value
, choices
))
440 # Not supplying a default is different from a default of None,
441 # so we need an explicit "not supplied" value.
442 NO_DEFAULT
= ("NO", "DEFAULT")
448 _short_opts : [string]
449 _long_opts : [string]
459 callback_args : (any*)
460 callback_kwargs : { string : any }
465 # The list of instance attributes that may be set through
466 # keyword args to the constructor.
480 # The set of actions allowed by option parsers. Explicitly listed
481 # here so the constructor can validate its arguments.
493 # The set of actions that involve storing a value somewhere;
494 # also listed just for constructor argument validation. (If
495 # the action is one of these, there must be a destination.)
496 STORE_ACTIONS
= ("store",
504 # The set of actions for which it makes sense to supply a value
505 # type, ie. which may consume an argument from the command line.
506 TYPED_ACTIONS
= ("store",
510 # The set of actions which *require* a value type, ie. that
511 # always consume an argument from the command line.
512 ALWAYS_TYPED_ACTIONS
= ("store",
515 # The set of actions which take a 'const' attribute.
516 CONST_ACTIONS
= ("store_const",
519 # The set of known types for option parsers. Again, listed here for
520 # constructor argument validation.
521 TYPES
= ("string", "int", "long", "float", "complex", "choice")
523 # Dictionary of argument checking functions, which convert and
524 # validate option arguments according to the option type.
526 # Signature of checking functions is:
527 # check(option : Option, opt : string, value : string) -> any
529 # option is the Option instance calling the checker
530 # opt is the actual option seen on the command-line
531 # (eg. "-a", "--file")
532 # value is the option argument seen on the command-line
534 # The return value should be in the appropriate Python type
535 # for option.type -- eg. an integer if option.type == "int".
537 # If no checker is defined for a type, arguments will be
538 # unchecked and remain strings.
539 TYPE_CHECKER
= { "int" : check_builtin
,
540 "long" : check_builtin
,
541 "float" : check_builtin
,
542 "complex": check_builtin
,
543 "choice" : check_choice
,
547 # CHECK_METHODS is a list of unbound method objects; they are called
548 # by the constructor, in order, after all attributes are
549 # initialized. The list is created and filled in later, after all
550 # the methods are actually defined. (I just put it here because I
551 # like to define and document all class attributes in the same
552 # place.) Subclasses that add another _check_*() method should
553 # define their own CHECK_METHODS list that adds their check method
554 # to those from this class.
558 # -- Constructor/initialization methods ----------------------------
560 def __init__(self
, *opts
, **attrs
):
561 # Set _short_opts, _long_opts attrs from 'opts' tuple.
562 # Have to be set now, in case no option strings are supplied.
563 self
._short
_opts
= []
565 opts
= self
._check
_opt
_strings
(opts
)
566 self
._set
_opt
_strings
(opts
)
568 # Set all other attrs (action, type, etc.) from 'attrs' dict
569 self
._set
_attrs
(attrs
)
571 # Check all the attributes we just set. There are lots of
572 # complicated interdependencies, but luckily they can be farmed
573 # out to the _check_*() methods listed in CHECK_METHODS -- which
574 # could be handy for subclasses! The one thing these all share
575 # is that they raise OptionError if they discover a problem.
576 for checker
in self
.CHECK_METHODS
:
579 def _check_opt_strings(self
, opts
):
580 # Filter out None because early versions of Optik had exactly
581 # one short option and one long option, either of which
583 opts
= filter(None, opts
)
585 raise TypeError("at least one option string must be supplied")
588 def _set_opt_strings(self
, opts
):
592 "invalid option string %r: "
593 "must be at least two characters long" % opt
, self
)
595 if not (opt
[0] == "-" and opt
[1] != "-"):
597 "invalid short option string %r: "
598 "must be of the form -x, (x any non-dash char)" % opt
,
600 self
._short
_opts
.append(opt
)
602 if not (opt
[0:2] == "--" and opt
[2] != "-"):
604 "invalid long option string %r: "
605 "must start with --, followed by non-dash" % opt
,
607 self
._long
_opts
.append(opt
)
609 def _set_attrs(self
, attrs
):
610 for attr
in self
.ATTRS
:
612 setattr(self
, attr
, attrs
[attr
])
615 if attr
== 'default':
616 setattr(self
, attr
, NO_DEFAULT
)
618 setattr(self
, attr
, None)
623 "invalid keyword arguments: %s" % ", ".join(attrs
),
627 # -- Constructor validation methods --------------------------------
629 def _check_action(self
):
630 if self
.action
is None:
631 self
.action
= "store"
632 elif self
.action
not in self
.ACTIONS
:
633 raise OptionError("invalid action: %r" % self
.action
, self
)
635 def _check_type(self
):
636 if self
.type is None:
637 if self
.action
in self
.ALWAYS_TYPED_ACTIONS
:
638 if self
.choices
is not None:
639 # The "choices" attribute implies "choice" type.
642 # No type given? "string" is the most sensible default.
645 # Allow type objects or builtin type conversion functions
646 # (int, str, etc.) as an alternative to their names. (The
647 # complicated check of __builtin__ is only necessary for
648 # Python 2.1 and earlier, and is short-circuited by the
649 # first check on modern Pythons.)
651 if ( type(self
.type) is types
.TypeType
or
652 (hasattr(self
.type, "__name__") and
653 getattr(__builtin__
, self
.type.__name
__, None) is self
.type) ):
654 self
.type = self
.type.__name
__
656 if self
.type == "str":
659 if self
.type not in self
.TYPES
:
660 raise OptionError("invalid option type: %r" % self
.type, self
)
661 if self
.action
not in self
.TYPED_ACTIONS
:
663 "must not supply a type for action %r" % self
.action
, self
)
665 def _check_choice(self
):
666 if self
.type == "choice":
667 if self
.choices
is None:
669 "must supply a list of choices for type 'choice'", self
)
670 elif type(self
.choices
) not in (types
.TupleType
, types
.ListType
):
672 "choices must be a list of strings ('%s' supplied)"
673 % str(type(self
.choices
)).split("'")[1], self
)
674 elif self
.choices
is not None:
676 "must not supply choices for type %r" % self
.type, self
)
678 def _check_dest(self
):
679 # No destination given, and we need one for this action. The
680 # self.type check is for callbacks that take a value.
681 takes_value
= (self
.action
in self
.STORE_ACTIONS
or
682 self
.type is not None)
683 if self
.dest
is None and takes_value
:
685 # Glean a destination from the first long option string,
686 # or from the first short option string if no long options.
688 # eg. "--foo-bar" -> "foo_bar"
689 self
.dest
= self
._long
_opts
[0][2:].replace('-', '_')
691 self
.dest
= self
._short
_opts
[0][1]
693 def _check_const(self
):
694 if self
.action
not in self
.CONST_ACTIONS
and self
.const
is not None:
696 "'const' must not be supplied for action %r" % self
.action
,
699 def _check_nargs(self
):
700 if self
.action
in self
.TYPED_ACTIONS
:
701 if self
.nargs
is None:
703 elif self
.nargs
is not None:
705 "'nargs' must not be supplied for action %r" % self
.action
,
708 def _check_callback(self
):
709 if self
.action
== "callback":
710 if not hasattr(self
.callback
, '__call__'):
712 "callback not callable: %r" % self
.callback
, self
)
713 if (self
.callback_args
is not None and
714 type(self
.callback_args
) is not types
.TupleType
):
716 "callback_args, if supplied, must be a tuple: not %r"
717 % self
.callback_args
, self
)
718 if (self
.callback_kwargs
is not None and
719 type(self
.callback_kwargs
) is not types
.DictType
):
721 "callback_kwargs, if supplied, must be a dict: not %r"
722 % self
.callback_kwargs
, self
)
724 if self
.callback
is not None:
726 "callback supplied (%r) for non-callback option"
727 % self
.callback
, self
)
728 if self
.callback_args
is not None:
730 "callback_args supplied for non-callback option", self
)
731 if self
.callback_kwargs
is not None:
733 "callback_kwargs supplied for non-callback option", self
)
736 CHECK_METHODS
= [_check_action
,
745 # -- Miscellaneous methods -----------------------------------------
748 return "/".join(self
._short
_opts
+ self
._long
_opts
)
752 def takes_value(self
):
753 return self
.type is not None
755 def get_opt_string(self
):
757 return self
._long
_opts
[0]
759 return self
._short
_opts
[0]
762 # -- Processing methods --------------------------------------------
764 def check_value(self
, opt
, value
):
765 checker
= self
.TYPE_CHECKER
.get(self
.type)
769 return checker(self
, opt
, value
)
771 def convert_value(self
, opt
, value
):
772 if value
is not None:
774 return self
.check_value(opt
, value
)
776 return tuple([self
.check_value(opt
, v
) for v
in value
])
778 def process(self
, opt
, value
, values
, parser
):
780 # First, convert the value(s) to the right type. Howl if any
781 # value(s) are bogus.
782 value
= self
.convert_value(opt
, value
)
784 # And then take whatever action is expected of us.
785 # This is a separate method to make life easier for
786 # subclasses to add new actions.
787 return self
.take_action(
788 self
.action
, self
.dest
, opt
, value
, values
, parser
)
790 def take_action(self
, action
, dest
, opt
, value
, values
, parser
):
791 if action
== "store":
792 setattr(values
, dest
, value
)
793 elif action
== "store_const":
794 setattr(values
, dest
, self
.const
)
795 elif action
== "store_true":
796 setattr(values
, dest
, True)
797 elif action
== "store_false":
798 setattr(values
, dest
, False)
799 elif action
== "append":
800 values
.ensure_value(dest
, []).append(value
)
801 elif action
== "append_const":
802 values
.ensure_value(dest
, []).append(self
.const
)
803 elif action
== "count":
804 setattr(values
, dest
, values
.ensure_value(dest
, 0) + 1)
805 elif action
== "callback":
806 args
= self
.callback_args
or ()
807 kwargs
= self
.callback_kwargs
or {}
808 self
.callback(self
, opt
, value
, parser
, *args
, **kwargs
)
809 elif action
== "help":
812 elif action
== "version":
813 parser
.print_version()
816 raise ValueError("unknown action %r" % self
.action
)
823 SUPPRESS_HELP
= "SUPPRESS"+"HELP"
824 SUPPRESS_USAGE
= "SUPPRESS"+"USAGE"
830 return isinstance(x
, (types
.StringType
, types
.UnicodeType
))
833 return isinstance(x
, basestring
)
837 def __init__(self
, defaults
=None):
839 for (attr
, val
) in defaults
.items():
840 setattr(self
, attr
, val
)
843 return str(self
.__dict
__)
847 def __cmp__(self
, other
):
848 if isinstance(other
, Values
):
849 return cmp(self
.__dict
__, other
.__dict
__)
850 elif isinstance(other
, types
.DictType
):
851 return cmp(self
.__dict
__, other
)
855 def _update_careful(self
, dict):
857 Update the option values from an arbitrary dictionary, but only
858 use keys from dict that already have a corresponding attribute
859 in self. Any keys in dict without a corresponding attribute
860 are silently ignored.
862 for attr
in dir(self
):
866 setattr(self
, attr
, dval
)
868 def _update_loose(self
, dict):
870 Update the option values from an arbitrary dictionary,
871 using all keys from the dictionary regardless of whether
872 they have a corresponding attribute in self or not.
874 self
.__dict
__.update(dict)
876 def _update(self
, dict, mode
):
877 if mode
== "careful":
878 self
._update
_careful
(dict)
879 elif mode
== "loose":
880 self
._update
_loose
(dict)
882 raise ValueError, "invalid update mode: %r" % mode
884 def read_module(self
, modname
, mode
="careful"):
886 mod
= sys
.modules
[modname
]
887 self
._update
(vars(mod
), mode
)
889 def read_file(self
, filename
, mode
="careful"):
891 execfile(filename
, vars)
892 self
._update
(vars, mode
)
894 def ensure_value(self
, attr
, value
):
895 if not hasattr(self
, attr
) or getattr(self
, attr
) is None:
896 setattr(self
, attr
, value
)
897 return getattr(self
, attr
)
900 class OptionContainer
:
906 standard_option_list : [Option]
907 list of standard options that will be accepted by all instances
908 of this parser class (intended to be overridden by subclasses).
911 option_list : [Option]
912 the list of Option objects contained by this OptionContainer
913 _short_opt : { string : Option }
914 dictionary mapping short option strings, eg. "-f" or "-X",
915 to the Option instances that implement them. If an Option
916 has multiple short option strings, it will appears in this
917 dictionary multiple times. [1]
918 _long_opt : { string : Option }
919 dictionary mapping long option strings, eg. "--file" or
920 "--exclude", to the Option instances that implement them.
921 Again, a given Option can occur multiple times in this
923 defaults : { string : any }
924 dictionary mapping option destination names to default
925 values for each destination [1]
927 [1] These mappings are common to (shared by) all components of the
928 controlling OptionParser, where they are initially created.
932 def __init__(self
, option_class
, conflict_handler
, description
):
933 # Initialize the option list and related data structures.
934 # This method must be provided by subclasses, and it must
935 # initialize at least the following instance attributes:
936 # option_list, _short_opt, _long_opt, defaults.
937 self
._create
_option
_list
()
939 self
.option_class
= option_class
940 self
.set_conflict_handler(conflict_handler
)
941 self
.set_description(description
)
943 def _create_option_mappings(self
):
944 # For use by OptionParser constructor -- create the master
945 # option mappings used by this OptionParser and all
946 # OptionGroups that it owns.
947 self
._short
_opt
= {} # single letter -> Option instance
948 self
._long
_opt
= {} # long option -> Option instance
949 self
.defaults
= {} # maps option dest -> default value
952 def _share_option_mappings(self
, parser
):
953 # For use by OptionGroup constructor -- use shared option
954 # mappings from the OptionParser that owns this OptionGroup.
955 self
._short
_opt
= parser
._short
_opt
956 self
._long
_opt
= parser
._long
_opt
957 self
.defaults
= parser
.defaults
959 def set_conflict_handler(self
, handler
):
960 if handler
not in ("error", "resolve"):
961 raise ValueError, "invalid conflict_resolution value %r" % handler
962 self
.conflict_handler
= handler
964 def set_description(self
, description
):
965 self
.description
= description
967 def get_description(self
):
968 return self
.description
972 """see OptionParser.destroy()."""
978 # -- Option-adding methods -----------------------------------------
980 def _check_conflict(self
, option
):
982 for opt
in option
._short
_opts
:
983 if opt
in self
._short
_opt
:
984 conflict_opts
.append((opt
, self
._short
_opt
[opt
]))
985 for opt
in option
._long
_opts
:
986 if opt
in self
._long
_opt
:
987 conflict_opts
.append((opt
, self
._long
_opt
[opt
]))
990 handler
= self
.conflict_handler
991 if handler
== "error":
992 raise OptionConflictError(
993 "conflicting option string(s): %s"
994 % ", ".join([co
[0] for co
in conflict_opts
]),
996 elif handler
== "resolve":
997 for (opt
, c_option
) in conflict_opts
:
998 if opt
.startswith("--"):
999 c_option
._long
_opts
.remove(opt
)
1000 del self
._long
_opt
[opt
]
1002 c_option
._short
_opts
.remove(opt
)
1003 del self
._short
_opt
[opt
]
1004 if not (c_option
._short
_opts
or c_option
._long
_opts
):
1005 c_option
.container
.option_list
.remove(c_option
)
1007 def add_option(self
, *args
, **kwargs
):
1008 """add_option(Option)
1009 add_option(opt_str, ..., kwarg=val, ...)
1011 if type(args
[0]) is types
.StringType
:
1012 option
= self
.option_class(*args
, **kwargs
)
1013 elif len(args
) == 1 and not kwargs
:
1015 if not isinstance(option
, Option
):
1016 raise TypeError, "not an Option instance: %r" % option
1018 raise TypeError, "invalid arguments"
1020 self
._check
_conflict
(option
)
1022 self
.option_list
.append(option
)
1023 option
.container
= self
1024 for opt
in option
._short
_opts
:
1025 self
._short
_opt
[opt
] = option
1026 for opt
in option
._long
_opts
:
1027 self
._long
_opt
[opt
] = option
1029 if option
.dest
is not None: # option has a dest, we need a default
1030 if option
.default
is not NO_DEFAULT
:
1031 self
.defaults
[option
.dest
] = option
.default
1032 elif option
.dest
not in self
.defaults
:
1033 self
.defaults
[option
.dest
] = None
1037 def add_options(self
, option_list
):
1038 for option
in option_list
:
1039 self
.add_option(option
)
1041 # -- Option query/removal methods ----------------------------------
1043 def get_option(self
, opt_str
):
1044 return (self
._short
_opt
.get(opt_str
) or
1045 self
._long
_opt
.get(opt_str
))
1047 def has_option(self
, opt_str
):
1048 return (opt_str
in self
._short
_opt
or
1049 opt_str
in self
._long
_opt
)
1051 def remove_option(self
, opt_str
):
1052 option
= self
._short
_opt
.get(opt_str
)
1054 option
= self
._long
_opt
.get(opt_str
)
1056 raise ValueError("no such option %r" % opt_str
)
1058 for opt
in option
._short
_opts
:
1059 del self
._short
_opt
[opt
]
1060 for opt
in option
._long
_opts
:
1061 del self
._long
_opt
[opt
]
1062 option
.container
.option_list
.remove(option
)
1065 # -- Help-formatting methods ---------------------------------------
1067 def format_option_help(self
, formatter
):
1068 if not self
.option_list
:
1071 for option
in self
.option_list
:
1072 if not option
.help is SUPPRESS_HELP
:
1073 result
.append(formatter
.format_option(option
))
1074 return "".join(result
)
1076 def format_description(self
, formatter
):
1077 return formatter
.format_description(self
.get_description())
1079 def format_help(self
, formatter
):
1081 if self
.description
:
1082 result
.append(self
.format_description(formatter
))
1083 if self
.option_list
:
1084 result
.append(self
.format_option_help(formatter
))
1085 return "\n".join(result
)
1088 class OptionGroup (OptionContainer
):
1090 def __init__(self
, parser
, title
, description
=None):
1091 self
.parser
= parser
1092 OptionContainer
.__init
__(
1093 self
, parser
.option_class
, parser
.conflict_handler
, description
)
1096 def _create_option_list(self
):
1097 self
.option_list
= []
1098 self
._share
_option
_mappings
(self
.parser
)
1100 def set_title(self
, title
):
1104 """see OptionParser.destroy()."""
1105 OptionContainer
.destroy(self
)
1106 del self
.option_list
1108 # -- Help-formatting methods ---------------------------------------
1110 def format_help(self
, formatter
):
1111 result
= formatter
.format_heading(self
.title
)
1113 result
+= OptionContainer
.format_help(self
, formatter
)
1118 class OptionParser (OptionContainer
):
1122 standard_option_list : [Option]
1123 list of standard options that will be accepted by all instances
1124 of this parser class (intended to be overridden by subclasses).
1126 Instance attributes:
1128 a usage string for your program. Before it is displayed
1129 to the user, "%prog" will be expanded to the name of
1130 your program (self.prog or os.path.basename(sys.argv[0])).
1132 the name of the current program (to override
1133 os.path.basename(sys.argv[0])).
1135 paragraph of help text to print after option help
1137 option_groups : [OptionGroup]
1138 list of option groups in this parser (option groups are
1139 irrelevant for parsing the command-line, but very useful
1140 for generating help)
1142 allow_interspersed_args : bool = true
1143 if true, positional arguments may be interspersed with options.
1144 Assuming -a and -b each take a single argument, the command-line
1145 -ablah foo bar -bboo baz
1146 will be interpreted the same as
1147 -ablah -bboo -- foo bar baz
1148 If this flag were false, that command line would be interpreted as
1149 -ablah -- foo bar -bboo baz
1150 -- ie. we stop processing options as soon as we see the first
1151 non-option argument. (This is the tradition followed by
1152 Python's getopt module, Perl's Getopt::Std, and other argument-
1153 parsing libraries, but it is generally annoying to users.)
1155 process_default_values : bool = true
1156 if true, option default values are processed similarly to option
1157 values from the command line: that is, they are passed to the
1158 type-checking function for the option's type (as long as the
1159 default value is a string). (This really only matters if you
1160 have defined custom types; see SF bug #955889.) Set it to false
1161 to restore the behaviour of Optik 1.4.1 and earlier.
1164 the argument list currently being parsed. Only set when
1165 parse_args() is active, and continually trimmed down as
1166 we consume arguments. Mainly there for the benefit of
1169 the list of leftover arguments that we have skipped while
1170 parsing options. If allow_interspersed_args is false, this
1171 list is always empty.
1173 the set of option values currently being accumulated. Only
1174 set when parse_args() is active. Also mainly for callbacks.
1176 Because of the 'rargs', 'largs', and 'values' attributes,
1177 OptionParser is not thread-safe. If, for some perverse reason, you
1178 need to parse command-line arguments simultaneously in different
1179 threads, use different OptionParser instances.
1183 standard_option_list
= []
1188 option_class
=Option
,
1190 conflict_handler
="error",
1193 add_help_option
=True,
1196 OptionContainer
.__init
__(
1197 self
, option_class
, conflict_handler
, description
)
1198 self
.set_usage(usage
)
1200 self
.version
= version
1201 self
.allow_interspersed_args
= True
1202 self
.process_default_values
= True
1203 if formatter
is None:
1204 formatter
= IndentedHelpFormatter()
1205 self
.formatter
= formatter
1206 self
.formatter
.set_parser(self
)
1207 self
.epilog
= epilog
1209 # Populate the option list; initial sources are the
1210 # standard_option_list class attribute, the 'option_list'
1211 # argument, and (if applicable) the _add_version_option() and
1212 # _add_help_option() methods.
1213 self
._populate
_option
_list
(option_list
,
1214 add_help
=add_help_option
)
1216 self
._init
_parsing
_state
()
1221 Declare that you are done with this OptionParser. This cleans up
1222 reference cycles so the OptionParser (and all objects referenced by
1223 it) can be garbage-collected promptly. After calling destroy(), the
1224 OptionParser is unusable.
1226 OptionContainer
.destroy(self
)
1227 for group
in self
.option_groups
:
1229 del self
.option_list
1230 del self
.option_groups
1234 # -- Private methods -----------------------------------------------
1235 # (used by our or OptionContainer's constructor)
1237 def _create_option_list(self
):
1238 self
.option_list
= []
1239 self
.option_groups
= []
1240 self
._create
_option
_mappings
()
1242 def _add_help_option(self
):
1243 self
.add_option("-h", "--help",
1245 help=_("show this help message and exit"))
1247 def _add_version_option(self
):
1248 self
.add_option("--version",
1250 help=_("show program's version number and exit"))
1252 def _populate_option_list(self
, option_list
, add_help
=True):
1253 if self
.standard_option_list
:
1254 self
.add_options(self
.standard_option_list
)
1256 self
.add_options(option_list
)
1258 self
._add
_version
_option
()
1260 self
._add
_help
_option
()
1262 def _init_parsing_state(self
):
1263 # These are set in parse_args() for the convenience of callbacks.
1269 # -- Simple modifier methods ---------------------------------------
1271 def set_usage(self
, usage
):
1273 self
.usage
= _("%prog [options]")
1274 elif usage
is SUPPRESS_USAGE
:
1276 # For backwards compatibility with Optik 1.3 and earlier.
1277 elif usage
.lower().startswith("usage: "):
1278 self
.usage
= usage
[7:]
1282 def enable_interspersed_args(self
):
1283 """Set parsing to not stop on the first non-option, allowing
1284 interspersing switches with command arguments. This is the
1285 default behavior. See also disable_interspersed_args() and the
1286 class documentation description of the attribute
1287 allow_interspersed_args."""
1288 self
.allow_interspersed_args
= True
1290 def disable_interspersed_args(self
):
1291 """Set parsing to stop on the first non-option. Use this if
1292 you have a command processor which runs another command that
1293 has options of its own and you want to make sure these options
1296 self
.allow_interspersed_args
= False
1298 def set_process_default_values(self
, process
):
1299 self
.process_default_values
= process
1301 def set_default(self
, dest
, value
):
1302 self
.defaults
[dest
] = value
1304 def set_defaults(self
, **kwargs
):
1305 self
.defaults
.update(kwargs
)
1307 def _get_all_options(self
):
1308 options
= self
.option_list
[:]
1309 for group
in self
.option_groups
:
1310 options
.extend(group
.option_list
)
1313 def get_default_values(self
):
1314 if not self
.process_default_values
:
1315 # Old, pre-Optik 1.5 behaviour.
1316 return Values(self
.defaults
)
1318 defaults
= self
.defaults
.copy()
1319 for option
in self
._get
_all
_options
():
1320 default
= defaults
.get(option
.dest
)
1321 if isbasestring(default
):
1322 opt_str
= option
.get_opt_string()
1323 defaults
[option
.dest
] = option
.check_value(opt_str
, default
)
1325 return Values(defaults
)
1328 # -- OptionGroup methods -------------------------------------------
1330 def add_option_group(self
, *args
, **kwargs
):
1331 # XXX lots of overlap with OptionContainer.add_option()
1332 if type(args
[0]) is types
.StringType
:
1333 group
= OptionGroup(self
, *args
, **kwargs
)
1334 elif len(args
) == 1 and not kwargs
:
1336 if not isinstance(group
, OptionGroup
):
1337 raise TypeError, "not an OptionGroup instance: %r" % group
1338 if group
.parser
is not self
:
1339 raise ValueError, "invalid OptionGroup (wrong parser)"
1341 raise TypeError, "invalid arguments"
1343 self
.option_groups
.append(group
)
1346 def get_option_group(self
, opt_str
):
1347 option
= (self
._short
_opt
.get(opt_str
) or
1348 self
._long
_opt
.get(opt_str
))
1349 if option
and option
.container
is not self
:
1350 return option
.container
1354 # -- Option-parsing methods ----------------------------------------
1356 def _get_args(self
, args
):
1360 return args
[:] # don't modify caller's list
1362 def parse_args(self
, args
=None, values
=None):
1364 parse_args(args : [string] = sys.argv[1:],
1365 values : Values = None)
1366 -> (values : Values, args : [string])
1368 Parse the command-line options found in 'args' (default:
1369 sys.argv[1:]). Any errors result in a call to 'error()', which
1370 by default prints the usage message to stderr and calls
1371 sys.exit() with an error message. On success returns a pair
1372 (values, args) where 'values' is an Values instance (with all
1373 your option values) and 'args' is the list of arguments left
1374 over after parsing options.
1376 rargs
= self
._get
_args
(args
)
1378 values
= self
.get_default_values()
1380 # Store the halves of the argument list as attributes for the
1381 # convenience of callbacks:
1383 # the rest of the command-line (the "r" stands for
1384 # "remaining" or "right-hand")
1386 # the leftover arguments -- ie. what's left after removing
1387 # options and their arguments (the "l" stands for "leftover"
1390 self
.largs
= largs
= []
1391 self
.values
= values
1394 stop
= self
._process
_args
(largs
, rargs
, values
)
1395 except (BadOptionError
, OptionValueError
), err
:
1396 self
.error(str(err
))
1398 args
= largs
+ rargs
1399 return self
.check_values(values
, args
)
1401 def check_values(self
, values
, args
):
1403 check_values(values : Values, args : [string])
1404 -> (values : Values, args : [string])
1406 Check that the supplied option values and leftover arguments are
1407 valid. Returns the option values and leftover arguments
1408 (possibly adjusted, possibly completely new -- whatever you
1409 like). Default implementation just returns the passed-in
1410 values; subclasses may override as desired.
1412 return (values
, args
)
1414 def _process_args(self
, largs
, rargs
, values
):
1415 """_process_args(largs : [string],
1419 Process command-line arguments and populate 'values', consuming
1420 options and arguments from 'rargs'. If 'allow_interspersed_args' is
1421 false, stop at the first non-option argument. If true, accumulate any
1422 interspersed non-option arguments in 'largs'.
1426 # We handle bare "--" explicitly, and bare "-" is handled by the
1427 # standard arg handler since the short arg case ensures that the
1428 # len of the opt string is greater than 1.
1432 elif arg
[0:2] == "--":
1433 # process a single long option (possibly with value(s))
1434 self
._process
_long
_opt
(rargs
, values
)
1435 elif arg
[:1] == "-" and len(arg
) > 1:
1436 # process a cluster of short options (possibly with
1437 # value(s) for the last one only)
1438 self
._process
_short
_opts
(rargs
, values
)
1439 elif self
.allow_interspersed_args
:
1443 return # stop now, leave this arg in rargs
1445 # Say this is the original argument list:
1446 # [arg0, arg1, ..., arg(i-1), arg(i), arg(i+1), ..., arg(N-1)]
1448 # (we are about to process arg(i)).
1450 # Then rargs is [arg(i), ..., arg(N-1)] and largs is a *subset* of
1451 # [arg0, ..., arg(i-1)] (any options and their arguments will have
1452 # been removed from largs).
1454 # The while loop will usually consume 1 or more arguments per pass.
1455 # If it consumes 1 (eg. arg is an option that takes no arguments),
1456 # then after _process_arg() is done the situation is:
1458 # largs = subset of [arg0, ..., arg(i)]
1459 # rargs = [arg(i+1), ..., arg(N-1)]
1461 # If allow_interspersed_args is false, largs will always be
1462 # *empty* -- still a subset of [arg0, ..., arg(i-1)], but
1463 # not a very interesting subset!
1465 def _match_long_opt(self
, opt
):
1466 """_match_long_opt(opt : string) -> string
1468 Determine which long option string 'opt' matches, ie. which one
1469 it is an unambiguous abbrevation for. Raises BadOptionError if
1470 'opt' doesn't unambiguously match any long option string.
1472 return _match_abbrev(opt
, self
._long
_opt
)
1474 def _process_long_opt(self
, rargs
, values
):
1477 # Value explicitly attached to arg? Pretend it's the next
1480 (opt
, next_arg
) = arg
.split("=", 1)
1481 rargs
.insert(0, next_arg
)
1482 had_explicit_value
= True
1485 had_explicit_value
= False
1487 opt
= self
._match
_long
_opt
(opt
)
1488 option
= self
._long
_opt
[opt
]
1489 if option
.takes_value():
1490 nargs
= option
.nargs
1491 if len(rargs
) < nargs
:
1493 self
.error(_("%s option requires an argument") % opt
)
1495 self
.error(_("%s option requires %d arguments")
1498 value
= rargs
.pop(0)
1500 value
= tuple(rargs
[0:nargs
])
1503 elif had_explicit_value
:
1504 self
.error(_("%s option does not take a value") % opt
)
1509 option
.process(opt
, value
, values
, self
)
1511 def _process_short_opts(self
, rargs
, values
):
1517 option
= self
._short
_opt
.get(opt
)
1518 i
+= 1 # we have consumed a character
1521 raise BadOptionError(opt
)
1522 if option
.takes_value():
1523 # Any characters left in arg? Pretend they're the
1524 # next arg, and stop consuming characters of arg.
1526 rargs
.insert(0, arg
[i
:])
1529 nargs
= option
.nargs
1530 if len(rargs
) < nargs
:
1532 self
.error(_("%s option requires an argument") % opt
)
1534 self
.error(_("%s option requires %d arguments")
1537 value
= rargs
.pop(0)
1539 value
= tuple(rargs
[0:nargs
])
1542 else: # option doesn't take a value
1545 option
.process(opt
, value
, values
, self
)
1551 # -- Feedback methods ----------------------------------------------
1553 def get_prog_name(self
):
1554 if self
.prog
is None:
1555 return os
.path
.basename(sys
.argv
[0])
1559 def expand_prog_name(self
, s
):
1560 return s
.replace("%prog", self
.get_prog_name())
1562 def get_description(self
):
1563 return self
.expand_prog_name(self
.description
)
1565 def exit(self
, status
=0, msg
=None):
1567 sys
.stderr
.write(msg
)
1570 def error(self
, msg
):
1571 """error(msg : string)
1573 Print a usage message incorporating 'msg' to stderr and exit.
1574 If you override this in a subclass, it should not return -- it
1575 should either exit or raise an exception.
1577 self
.print_usage(sys
.stderr
)
1578 self
.exit(2, "%s: error: %s\n" % (self
.get_prog_name(), msg
))
1580 def get_usage(self
):
1582 return self
.formatter
.format_usage(
1583 self
.expand_prog_name(self
.usage
))
1587 def print_usage(self
, file=None):
1588 """print_usage(file : file = stdout)
1590 Print the usage message for the current program (self.usage) to
1591 'file' (default stdout). Any occurrence of the string "%prog" in
1592 self.usage is replaced with the name of the current program
1593 (basename of sys.argv[0]). Does nothing if self.usage is empty
1597 print >>file, self
.get_usage()
1599 def get_version(self
):
1601 return self
.expand_prog_name(self
.version
)
1605 def print_version(self
, file=None):
1606 """print_version(file : file = stdout)
1608 Print the version message for this program (self.version) to
1609 'file' (default stdout). As with print_usage(), any occurrence
1610 of "%prog" in self.version is replaced by the current program's
1611 name. Does nothing if self.version is empty or undefined.
1614 print >>file, self
.get_version()
1616 def format_option_help(self
, formatter
=None):
1617 if formatter
is None:
1618 formatter
= self
.formatter
1619 formatter
.store_option_strings(self
)
1621 result
.append(formatter
.format_heading(_("Options")))
1623 if self
.option_list
:
1624 result
.append(OptionContainer
.format_option_help(self
, formatter
))
1626 for group
in self
.option_groups
:
1627 result
.append(group
.format_help(formatter
))
1630 # Drop the last "\n", or the header if no options or option groups:
1631 return "".join(result
[:-1])
1633 def format_epilog(self
, formatter
):
1634 return formatter
.format_epilog(self
.epilog
)
1636 def format_help(self
, formatter
=None):
1637 if formatter
is None:
1638 formatter
= self
.formatter
1641 result
.append(self
.get_usage() + "\n")
1642 if self
.description
:
1643 result
.append(self
.format_description(formatter
) + "\n")
1644 result
.append(self
.format_option_help(formatter
))
1645 result
.append(self
.format_epilog(formatter
))
1646 return "".join(result
)
1648 # used by test suite
1649 def _get_encoding(self
, file):
1650 encoding
= getattr(file, "encoding", None)
1652 encoding
= sys
.getdefaultencoding()
1655 def print_help(self
, file=None):
1656 """print_help(file : file = stdout)
1658 Print an extended help message, listing all options and any
1659 help text provided with them, to 'file' (default stdout).
1663 encoding
= self
._get
_encoding
(file)
1664 file.write(self
.format_help().encode(encoding
, "replace"))
1666 # class OptionParser
1669 def _match_abbrev(s
, wordmap
):
1670 """_match_abbrev(s : string, wordmap : {string : Option}) -> string
1672 Return the string key in 'wordmap' for which 's' is an unambiguous
1673 abbreviation. If 's' is found to be ambiguous or doesn't match any of
1674 'words', raise BadOptionError.
1676 # Is there an exact match?
1680 # Isolate all words with s as a prefix.
1681 possibilities
= [word
for word
in wordmap
.keys()
1682 if word
.startswith(s
)]
1683 # No exact match, so there had better be just one possibility.
1684 if len(possibilities
) == 1:
1685 return possibilities
[0]
1686 elif not possibilities
:
1687 raise BadOptionError(s
)
1689 # More than one possible completion: ambiguous prefix.
1690 possibilities
.sort()
1691 raise AmbiguousOptionError(s
, possibilities
)
1694 # Some day, there might be many Option classes. As of Optik 1.3, the
1695 # preferred way to instantiate Options is indirectly, via make_option(),
1696 # which will become a factory function when there are many Option
1698 make_option
= Option