Home | History | Annotate | Download | only in Lib
      1 # Author: Steven J. Bethard <steven.bethard (at] gmail.com>.
      2 
      3 """Command-line parsing library
      4 
      5 This module is an optparse-inspired command-line parsing library that:
      6 
      7     - handles both optional and positional arguments
      8     - produces highly informative usage messages
      9     - supports parsers that dispatch to sub-parsers
     10 
     11 The following is a simple usage example that sums integers from the
     12 command-line and writes the result to a file::
     13 
     14     parser = argparse.ArgumentParser(
     15         description='sum the integers at the command line')
     16     parser.add_argument(
     17         'integers', metavar='int', nargs='+', type=int,
     18         help='an integer to be summed')
     19     parser.add_argument(
     20         '--log', default=sys.stdout, type=argparse.FileType('w'),
     21         help='the file where the sum should be written')
     22     args = parser.parse_args()
     23     args.log.write('%s' % sum(args.integers))
     24     args.log.close()
     25 
     26 The module contains the following public classes:
     27 
     28     - ArgumentParser -- The main entry point for command-line parsing. As the
     29         example above shows, the add_argument() method is used to populate
     30         the parser with actions for optional and positional arguments. Then
     31         the parse_args() method is invoked to convert the args at the
     32         command-line into an object with attributes.
     33 
     34     - ArgumentError -- The exception raised by ArgumentParser objects when
     35         there are errors with the parser's actions. Errors raised while
     36         parsing the command-line are caught by ArgumentParser and emitted
     37         as command-line messages.
     38 
     39     - FileType -- A factory for defining types of files to be created. As the
     40         example above shows, instances of FileType are typically passed as
     41         the type= argument of add_argument() calls.
     42 
     43     - Action -- The base class for parser actions. Typically actions are
     44         selected by passing strings like 'store_true' or 'append_const' to
     45         the action= argument of add_argument(). However, for greater
     46         customization of ArgumentParser actions, subclasses of Action may
     47         be defined and passed as the action= argument.
     48 
     49     - HelpFormatter, RawDescriptionHelpFormatter, RawTextHelpFormatter,
     50         ArgumentDefaultsHelpFormatter -- Formatter classes which
     51         may be passed as the formatter_class= argument to the
     52         ArgumentParser constructor. HelpFormatter is the default,
     53         RawDescriptionHelpFormatter and RawTextHelpFormatter tell the parser
     54         not to change the formatting for help text, and
     55         ArgumentDefaultsHelpFormatter adds information about argument defaults
     56         to the help.
     57 
     58 All other classes in this module are considered implementation details.
     59 (Also note that HelpFormatter and RawDescriptionHelpFormatter are only
     60 considered public as object names -- the API of the formatter objects is
     61 still considered an implementation detail.)
     62 """
     63 
     64 __version__ = '1.1'
     65 __all__ = [
     66     'ArgumentParser',
     67     'ArgumentError',
     68     'ArgumentTypeError',
     69     'FileType',
     70     'HelpFormatter',
     71     'ArgumentDefaultsHelpFormatter',
     72     'RawDescriptionHelpFormatter',
     73     'RawTextHelpFormatter',
     74     'Namespace',
     75     'Action',
     76     'ONE_OR_MORE',
     77     'OPTIONAL',
     78     'PARSER',
     79     'REMAINDER',
     80     'SUPPRESS',
     81     'ZERO_OR_MORE',
     82 ]
     83 
     84 
     85 import collections as _collections
     86 import copy as _copy
     87 import os as _os
     88 import re as _re
     89 import sys as _sys
     90 import textwrap as _textwrap
     91 
     92 from gettext import gettext as _
     93 
     94 
     95 def _callable(obj):
     96     return hasattr(obj, '__call__') or hasattr(obj, '__bases__')
     97 
     98 
     99 SUPPRESS = '==SUPPRESS=='
    100 
    101 OPTIONAL = '?'
    102 ZERO_OR_MORE = '*'
    103 ONE_OR_MORE = '+'
    104 PARSER = 'A...'
    105 REMAINDER = '...'
    106 _UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args'
    107 
    108 # =============================
    109 # Utility functions and classes
    110 # =============================
    111 
    112 class _AttributeHolder(object):
    113     """Abstract base class that provides __repr__.
    114 
    115     The __repr__ method returns a string in the format::
    116         ClassName(attr=name, attr=name, ...)
    117     The attributes are determined either by a class-level attribute,
    118     '_kwarg_names', or by inspecting the instance __dict__.
    119     """
    120 
    121     def __repr__(self):
    122         type_name = type(self).__name__
    123         arg_strings = []
    124         for arg in self._get_args():
    125             arg_strings.append(repr(arg))
    126         for name, value in self._get_kwargs():
    127             arg_strings.append('%s=%r' % (name, value))
    128         return '%s(%s)' % (type_name, ', '.join(arg_strings))
    129 
    130     def _get_kwargs(self):
    131         return sorted(self.__dict__.items())
    132 
    133     def _get_args(self):
    134         return []
    135 
    136 
    137 def _ensure_value(namespace, name, value):
    138     if getattr(namespace, name, None) is None:
    139         setattr(namespace, name, value)
    140     return getattr(namespace, name)
    141 
    142 
    143 # ===============
    144 # Formatting Help
    145 # ===============
    146 
    147 class HelpFormatter(object):
    148     """Formatter for generating usage messages and argument help strings.
    149 
    150     Only the name of this class is considered a public API. All the methods
    151     provided by the class are considered an implementation detail.
    152     """
    153 
    154     def __init__(self,
    155                  prog,
    156                  indent_increment=2,
    157                  max_help_position=24,
    158                  width=None):
    159 
    160         # default setting for width
    161         if width is None:
    162             try:
    163                 width = int(_os.environ['COLUMNS'])
    164             except (KeyError, ValueError):
    165                 width = 80
    166             width -= 2
    167 
    168         self._prog = prog
    169         self._indent_increment = indent_increment
    170         self._max_help_position = max_help_position
    171         self._max_help_position = min(max_help_position,
    172                                       max(width - 20, indent_increment * 2))
    173         self._width = width
    174 
    175         self._current_indent = 0
    176         self._level = 0
    177         self._action_max_length = 0
    178 
    179         self._root_section = self._Section(self, None)
    180         self._current_section = self._root_section
    181 
    182         self._whitespace_matcher = _re.compile(r'\s+')
    183         self._long_break_matcher = _re.compile(r'\n\n\n+')
    184 
    185     # ===============================
    186     # Section and indentation methods
    187     # ===============================
    188     def _indent(self):
    189         self._current_indent += self._indent_increment
    190         self._level += 1
    191 
    192     def _dedent(self):
    193         self._current_indent -= self._indent_increment
    194         assert self._current_indent >= 0, 'Indent decreased below 0.'
    195         self._level -= 1
    196 
    197     class _Section(object):
    198 
    199         def __init__(self, formatter, parent, heading=None):
    200             self.formatter = formatter
    201             self.parent = parent
    202             self.heading = heading
    203             self.items = []
    204 
    205         def format_help(self):
    206             # format the indented section
    207             if self.parent is not None:
    208                 self.formatter._indent()
    209             join = self.formatter._join_parts
    210             for func, args in self.items:
    211                 func(*args)
    212             item_help = join([func(*args) for func, args in self.items])
    213             if self.parent is not None:
    214                 self.formatter._dedent()
    215 
    216             # return nothing if the section was empty
    217             if not item_help:
    218                 return ''
    219 
    220             # add the heading if the section was non-empty
    221             if self.heading is not SUPPRESS and self.heading is not None:
    222                 current_indent = self.formatter._current_indent
    223                 heading = '%*s%s:\n' % (current_indent, '', self.heading)
    224             else:
    225                 heading = ''
    226 
    227             # join the section-initial newline, the heading and the help
    228             return join(['\n', heading, item_help, '\n'])
    229 
    230     def _add_item(self, func, args):
    231         self._current_section.items.append((func, args))
    232 
    233     # ========================
    234     # Message building methods
    235     # ========================
    236     def start_section(self, heading):
    237         self._indent()
    238         section = self._Section(self, self._current_section, heading)
    239         self._add_item(section.format_help, [])
    240         self._current_section = section
    241 
    242     def end_section(self):
    243         self._current_section = self._current_section.parent
    244         self._dedent()
    245 
    246     def add_text(self, text):
    247         if text is not SUPPRESS and text is not None:
    248             self._add_item(self._format_text, [text])
    249 
    250     def add_usage(self, usage, actions, groups, prefix=None):
    251         if usage is not SUPPRESS:
    252             args = usage, actions, groups, prefix
    253             self._add_item(self._format_usage, args)
    254 
    255     def add_argument(self, action):
    256         if action.help is not SUPPRESS:
    257 
    258             # find all invocations
    259             get_invocation = self._format_action_invocation
    260             invocations = [get_invocation(action)]
    261             for subaction in self._iter_indented_subactions(action):
    262                 invocations.append(get_invocation(subaction))
    263 
    264             # update the maximum item length
    265             invocation_length = max([len(s) for s in invocations])
    266             action_length = invocation_length + self._current_indent
    267             self._action_max_length = max(self._action_max_length,
    268                                           action_length)
    269 
    270             # add the item to the list
    271             self._add_item(self._format_action, [action])
    272 
    273     def add_arguments(self, actions):
    274         for action in actions:
    275             self.add_argument(action)
    276 
    277     # =======================
    278     # Help-formatting methods
    279     # =======================
    280     def format_help(self):
    281         help = self._root_section.format_help()
    282         if help:
    283             help = self._long_break_matcher.sub('\n\n', help)
    284             help = help.strip('\n') + '\n'
    285         return help
    286 
    287     def _join_parts(self, part_strings):
    288         return ''.join([part
    289                         for part in part_strings
    290                         if part and part is not SUPPRESS])
    291 
    292     def _format_usage(self, usage, actions, groups, prefix):
    293         if prefix is None:
    294             prefix = _('usage: ')
    295 
    296         # if usage is specified, use that
    297         if usage is not None:
    298             usage = usage % dict(prog=self._prog)
    299 
    300         # if no optionals or positionals are available, usage is just prog
    301         elif usage is None and not actions:
    302             usage = '%(prog)s' % dict(prog=self._prog)
    303 
    304         # if optionals and positionals are available, calculate usage
    305         elif usage is None:
    306             prog = '%(prog)s' % dict(prog=self._prog)
    307 
    308             # split optionals from positionals
    309             optionals = []
    310             positionals = []
    311             for action in actions:
    312                 if action.option_strings:
    313                     optionals.append(action)
    314                 else:
    315                     positionals.append(action)
    316 
    317             # build full usage string
    318             format = self._format_actions_usage
    319             action_usage = format(optionals + positionals, groups)
    320             usage = ' '.join([s for s in [prog, action_usage] if s])
    321 
    322             # wrap the usage parts if it's too long
    323             text_width = self._width - self._current_indent
    324             if len(prefix) + len(usage) > text_width:
    325 
    326                 # break usage into wrappable parts
    327                 part_regexp = (
    328                     r'\(.*?\)+(?=\s|$)|'
    329                     r'\[.*?\]+(?=\s|$)|'
    330                     r'\S+'
    331                 )
    332                 opt_usage = format(optionals, groups)
    333                 pos_usage = format(positionals, groups)
    334                 opt_parts = _re.findall(part_regexp, opt_usage)
    335                 pos_parts = _re.findall(part_regexp, pos_usage)
    336                 assert ' '.join(opt_parts) == opt_usage
    337                 assert ' '.join(pos_parts) == pos_usage
    338 
    339                 # helper for wrapping lines
    340                 def get_lines(parts, indent, prefix=None):
    341                     lines = []
    342                     line = []
    343                     if prefix is not None:
    344                         line_len = len(prefix) - 1
    345                     else:
    346                         line_len = len(indent) - 1
    347                     for part in parts:
    348                         if line_len + 1 + len(part) > text_width and line:
    349                             lines.append(indent + ' '.join(line))
    350                             line = []
    351                             line_len = len(indent) - 1
    352                         line.append(part)
    353                         line_len += len(part) + 1
    354                     if line:
    355                         lines.append(indent + ' '.join(line))
    356                     if prefix is not None:
    357                         lines[0] = lines[0][len(indent):]
    358                     return lines
    359 
    360                 # if prog is short, follow it with optionals or positionals
    361                 if len(prefix) + len(prog) <= 0.75 * text_width:
    362                     indent = ' ' * (len(prefix) + len(prog) + 1)
    363                     if opt_parts:
    364                         lines = get_lines([prog] + opt_parts, indent, prefix)
    365                         lines.extend(get_lines(pos_parts, indent))
    366                     elif pos_parts:
    367                         lines = get_lines([prog] + pos_parts, indent, prefix)
    368                     else:
    369                         lines = [prog]
    370 
    371                 # if prog is long, put it on its own line
    372                 else:
    373                     indent = ' ' * len(prefix)
    374                     parts = opt_parts + pos_parts
    375                     lines = get_lines(parts, indent)
    376                     if len(lines) > 1:
    377                         lines = []
    378                         lines.extend(get_lines(opt_parts, indent))
    379                         lines.extend(get_lines(pos_parts, indent))
    380                     lines = [prog] + lines
    381 
    382                 # join lines into usage
    383                 usage = '\n'.join(lines)
    384 
    385         # prefix with 'usage:'
    386         return '%s%s\n\n' % (prefix, usage)
    387 
    388     def _format_actions_usage(self, actions, groups):
    389         # find group indices and identify actions in groups
    390         group_actions = set()
    391         inserts = {}
    392         for group in groups:
    393             try:
    394                 start = actions.index(group._group_actions[0])
    395             except ValueError:
    396                 continue
    397             else:
    398                 end = start + len(group._group_actions)
    399                 if actions[start:end] == group._group_actions:
    400                     for action in group._group_actions:
    401                         group_actions.add(action)
    402                     if not group.required:
    403                         if start in inserts:
    404                             inserts[start] += ' ['
    405                         else:
    406                             inserts[start] = '['
    407                         inserts[end] = ']'
    408                     else:
    409                         if start in inserts:
    410                             inserts[start] += ' ('
    411                         else:
    412                             inserts[start] = '('
    413                         inserts[end] = ')'
    414                     for i in range(start + 1, end):
    415                         inserts[i] = '|'
    416 
    417         # collect all actions format strings
    418         parts = []
    419         for i, action in enumerate(actions):
    420 
    421             # suppressed arguments are marked with None
    422             # remove | separators for suppressed arguments
    423             if action.help is SUPPRESS:
    424                 parts.append(None)
    425                 if inserts.get(i) == '|':
    426                     inserts.pop(i)
    427                 elif inserts.get(i + 1) == '|':
    428                     inserts.pop(i + 1)
    429 
    430             # produce all arg strings
    431             elif not action.option_strings:
    432                 part = self._format_args(action, action.dest)
    433 
    434                 # if it's in a group, strip the outer []
    435                 if action in group_actions:
    436                     if part[0] == '[' and part[-1] == ']':
    437                         part = part[1:-1]
    438 
    439                 # add the action string to the list
    440                 parts.append(part)
    441 
    442             # produce the first way to invoke the option in brackets
    443             else:
    444                 option_string = action.option_strings[0]
    445 
    446                 # if the Optional doesn't take a value, format is:
    447                 #    -s or --long
    448                 if action.nargs == 0:
    449                     part = '%s' % option_string
    450 
    451                 # if the Optional takes a value, format is:
    452                 #    -s ARGS or --long ARGS
    453                 else:
    454                     default = action.dest.upper()
    455                     args_string = self._format_args(action, default)
    456                     part = '%s %s' % (option_string, args_string)
    457 
    458                 # make it look optional if it's not required or in a group
    459                 if not action.required and action not in group_actions:
    460                     part = '[%s]' % part
    461 
    462                 # add the action string to the list
    463                 parts.append(part)
    464 
    465         # insert things at the necessary indices
    466         for i in sorted(inserts, reverse=True):
    467             parts[i:i] = [inserts[i]]
    468 
    469         # join all the action items with spaces
    470         text = ' '.join([item for item in parts if item is not None])
    471 
    472         # clean up separators for mutually exclusive groups
    473         open = r'[\[(]'
    474         close = r'[\])]'
    475         text = _re.sub(r'(%s) ' % open, r'\1', text)
    476         text = _re.sub(r' (%s)' % close, r'\1', text)
    477         text = _re.sub(r'%s *%s' % (open, close), r'', text)
    478         text = _re.sub(r'\(([^|]*)\)', r'\1', text)
    479         text = text.strip()
    480 
    481         # return the text
    482         return text
    483 
    484     def _format_text(self, text):
    485         if '%(prog)' in text:
    486             text = text % dict(prog=self._prog)
    487         text_width = max(self._width - self._current_indent, 11)
    488         indent = ' ' * self._current_indent
    489         return self._fill_text(text, text_width, indent) + '\n\n'
    490 
    491     def _format_action(self, action):
    492         # determine the required width and the entry label
    493         help_position = min(self._action_max_length + 2,
    494                             self._max_help_position)
    495         help_width = max(self._width - help_position, 11)
    496         action_width = help_position - self._current_indent - 2
    497         action_header = self._format_action_invocation(action)
    498 
    499         # ho nelp; start on same line and add a final newline
    500         if not action.help:
    501             tup = self._current_indent, '', action_header
    502             action_header = '%*s%s\n' % tup
    503 
    504         # short action name; start on the same line and pad two spaces
    505         elif len(action_header) <= action_width:
    506             tup = self._current_indent, '', action_width, action_header
    507             action_header = '%*s%-*s  ' % tup
    508             indent_first = 0
    509 
    510         # long action name; start on the next line
    511         else:
    512             tup = self._current_indent, '', action_header
    513             action_header = '%*s%s\n' % tup
    514             indent_first = help_position
    515 
    516         # collect the pieces of the action help
    517         parts = [action_header]
    518 
    519         # if there was help for the action, add lines of help text
    520         if action.help:
    521             help_text = self._expand_help(action)
    522             help_lines = self._split_lines(help_text, help_width)
    523             parts.append('%*s%s\n' % (indent_first, '', help_lines[0]))
    524             for line in help_lines[1:]:
    525                 parts.append('%*s%s\n' % (help_position, '', line))
    526 
    527         # or add a newline if the description doesn't end with one
    528         elif not action_header.endswith('\n'):
    529             parts.append('\n')
    530 
    531         # if there are any sub-actions, add their help as well
    532         for subaction in self._iter_indented_subactions(action):
    533             parts.append(self._format_action(subaction))
    534 
    535         # return a single string
    536         return self._join_parts(parts)
    537 
    538     def _format_action_invocation(self, action):
    539         if not action.option_strings:
    540             metavar, = self._metavar_formatter(action, action.dest)(1)
    541             return metavar
    542 
    543         else:
    544             parts = []
    545 
    546             # if the Optional doesn't take a value, format is:
    547             #    -s, --long
    548             if action.nargs == 0:
    549                 parts.extend(action.option_strings)
    550 
    551             # if the Optional takes a value, format is:
    552             #    -s ARGS, --long ARGS
    553             else:
    554                 default = action.dest.upper()
    555                 args_string = self._format_args(action, default)
    556                 for option_string in action.option_strings:
    557                     parts.append('%s %s' % (option_string, args_string))
    558 
    559             return ', '.join(parts)
    560 
    561     def _metavar_formatter(self, action, default_metavar):
    562         if action.metavar is not None:
    563             result = action.metavar
    564         elif action.choices is not None:
    565             choice_strs = [str(choice) for choice in action.choices]
    566             result = '{%s}' % ','.join(choice_strs)
    567         else:
    568             result = default_metavar
    569 
    570         def format(tuple_size):
    571             if isinstance(result, tuple):
    572                 return result
    573             else:
    574                 return (result, ) * tuple_size
    575         return format
    576 
    577     def _format_args(self, action, default_metavar):
    578         get_metavar = self._metavar_formatter(action, default_metavar)
    579         if action.nargs is None:
    580             result = '%s' % get_metavar(1)
    581         elif action.nargs == OPTIONAL:
    582             result = '[%s]' % get_metavar(1)
    583         elif action.nargs == ZERO_OR_MORE:
    584             result = '[%s [%s ...]]' % get_metavar(2)
    585         elif action.nargs == ONE_OR_MORE:
    586             result = '%s [%s ...]' % get_metavar(2)
    587         elif action.nargs == REMAINDER:
    588             result = '...'
    589         elif action.nargs == PARSER:
    590             result = '%s ...' % get_metavar(1)
    591         else:
    592             formats = ['%s' for _ in range(action.nargs)]
    593             result = ' '.join(formats) % get_metavar(action.nargs)
    594         return result
    595 
    596     def _expand_help(self, action):
    597         params = dict(vars(action), prog=self._prog)
    598         for name in list(params):
    599             if params[name] is SUPPRESS:
    600                 del params[name]
    601         for name in list(params):
    602             if hasattr(params[name], '__name__'):
    603                 params[name] = params[name].__name__
    604         if params.get('choices') is not None:
    605             choices_str = ', '.join([str(c) for c in params['choices']])
    606             params['choices'] = choices_str
    607         return self._get_help_string(action) % params
    608 
    609     def _iter_indented_subactions(self, action):
    610         try:
    611             get_subactions = action._get_subactions
    612         except AttributeError:
    613             pass
    614         else:
    615             self._indent()
    616             for subaction in get_subactions():
    617                 yield subaction
    618             self._dedent()
    619 
    620     def _split_lines(self, text, width):
    621         text = self._whitespace_matcher.sub(' ', text).strip()
    622         return _textwrap.wrap(text, width)
    623 
    624     def _fill_text(self, text, width, indent):
    625         text = self._whitespace_matcher.sub(' ', text).strip()
    626         return _textwrap.fill(text, width, initial_indent=indent,
    627                                            subsequent_indent=indent)
    628 
    629     def _get_help_string(self, action):
    630         return action.help
    631 
    632 
    633 class RawDescriptionHelpFormatter(HelpFormatter):
    634     """Help message formatter which retains any formatting in descriptions.
    635 
    636     Only the name of this class is considered a public API. All the methods
    637     provided by the class are considered an implementation detail.
    638     """
    639 
    640     def _fill_text(self, text, width, indent):
    641         return ''.join([indent + line for line in text.splitlines(True)])
    642 
    643 
    644 class RawTextHelpFormatter(RawDescriptionHelpFormatter):
    645     """Help message formatter which retains formatting of all help text.
    646 
    647     Only the name of this class is considered a public API. All the methods
    648     provided by the class are considered an implementation detail.
    649     """
    650 
    651     def _split_lines(self, text, width):
    652         return text.splitlines()
    653 
    654 
    655 class ArgumentDefaultsHelpFormatter(HelpFormatter):
    656     """Help message formatter which adds default values to argument help.
    657 
    658     Only the name of this class is considered a public API. All the methods
    659     provided by the class are considered an implementation detail.
    660     """
    661 
    662     def _get_help_string(self, action):
    663         help = action.help
    664         if '%(default)' not in action.help:
    665             if action.default is not SUPPRESS:
    666                 defaulting_nargs = [OPTIONAL, ZERO_OR_MORE]
    667                 if action.option_strings or action.nargs in defaulting_nargs:
    668                     help += ' (default: %(default)s)'
    669         return help
    670 
    671 
    672 # =====================
    673 # Options and Arguments
    674 # =====================
    675 
    676 def _get_action_name(argument):
    677     if argument is None:
    678         return None
    679     elif argument.option_strings:
    680         return  '/'.join(argument.option_strings)
    681     elif argument.metavar not in (None, SUPPRESS):
    682         return argument.metavar
    683     elif argument.dest not in (None, SUPPRESS):
    684         return argument.dest
    685     else:
    686         return None
    687 
    688 
    689 class ArgumentError(Exception):
    690     """An error from creating or using an argument (optional or positional).
    691 
    692     The string value of this exception is the message, augmented with
    693     information about the argument that caused it.
    694     """
    695 
    696     def __init__(self, argument, message):
    697         self.argument_name = _get_action_name(argument)
    698         self.message = message
    699 
    700     def __str__(self):
    701         if self.argument_name is None:
    702             format = '%(message)s'
    703         else:
    704             format = 'argument %(argument_name)s: %(message)s'
    705         return format % dict(message=self.message,
    706                              argument_name=self.argument_name)
    707 
    708 
    709 class ArgumentTypeError(Exception):
    710     """An error from trying to convert a command line string to a type."""
    711     pass
    712 
    713 
    714 # ==============
    715 # Action classes
    716 # ==============
    717 
    718 class Action(_AttributeHolder):
    719     """Information about how to convert command line strings to Python objects.
    720 
    721     Action objects are used by an ArgumentParser to represent the information
    722     needed to parse a single argument from one or more strings from the
    723     command line. The keyword arguments to the Action constructor are also
    724     all attributes of Action instances.
    725 
    726     Keyword Arguments:
    727 
    728         - option_strings -- A list of command-line option strings which
    729             should be associated with this action.
    730 
    731         - dest -- The name of the attribute to hold the created object(s)
    732 
    733         - nargs -- The number of command-line arguments that should be
    734             consumed. By default, one argument will be consumed and a single
    735             value will be produced.  Other values include:
    736                 - N (an integer) consumes N arguments (and produces a list)
    737                 - '?' consumes zero or one arguments
    738                 - '*' consumes zero or more arguments (and produces a list)
    739                 - '+' consumes one or more arguments (and produces a list)
    740             Note that the difference between the default and nargs=1 is that
    741             with the default, a single value will be produced, while with
    742             nargs=1, a list containing a single value will be produced.
    743 
    744         - const -- The value to be produced if the option is specified and the
    745             option uses an action that takes no values.
    746 
    747         - default -- The value to be produced if the option is not specified.
    748 
    749         - type -- A callable that accepts a single string argument, and
    750             returns the converted value.  The standard Python types str, int,
    751             float, and complex are useful examples of such callables.  If None,
    752             str is used.
    753 
    754         - choices -- A container of values that should be allowed. If not None,
    755             after a command-line argument has been converted to the appropriate
    756             type, an exception will be raised if it is not a member of this
    757             collection.
    758 
    759         - required -- True if the action must always be specified at the
    760             command line. This is only meaningful for optional command-line
    761             arguments.
    762 
    763         - help -- The help string describing the argument.
    764 
    765         - metavar -- The name to be used for the option's argument with the
    766             help string. If None, the 'dest' value will be used as the name.
    767     """
    768 
    769     def __init__(self,
    770                  option_strings,
    771                  dest,
    772                  nargs=None,
    773                  const=None,
    774                  default=None,
    775                  type=None,
    776                  choices=None,
    777                  required=False,
    778                  help=None,
    779                  metavar=None):
    780         self.option_strings = option_strings
    781         self.dest = dest
    782         self.nargs = nargs
    783         self.const = const
    784         self.default = default
    785         self.type = type
    786         self.choices = choices
    787         self.required = required
    788         self.help = help
    789         self.metavar = metavar
    790 
    791     def _get_kwargs(self):
    792         names = [
    793             'option_strings',
    794             'dest',
    795             'nargs',
    796             'const',
    797             'default',
    798             'type',
    799             'choices',
    800             'help',
    801             'metavar',
    802         ]
    803         return [(name, getattr(self, name)) for name in names]
    804 
    805     def __call__(self, parser, namespace, values, option_string=None):
    806         raise NotImplementedError(_('.__call__() not defined'))
    807 
    808 
    809 class _StoreAction(Action):
    810 
    811     def __init__(self,
    812                  option_strings,
    813                  dest,
    814                  nargs=None,
    815                  const=None,
    816                  default=None,
    817                  type=None,
    818                  choices=None,
    819                  required=False,
    820                  help=None,
    821                  metavar=None):
    822         if nargs == 0:
    823             raise ValueError('nargs for store actions must be > 0; if you '
    824                              'have nothing to store, actions such as store '
    825                              'true or store const may be more appropriate')
    826         if const is not None and nargs != OPTIONAL:
    827             raise ValueError('nargs must be %r to supply const' % OPTIONAL)
    828         super(_StoreAction, self).__init__(
    829             option_strings=option_strings,
    830             dest=dest,
    831             nargs=nargs,
    832             const=const,
    833             default=default,
    834             type=type,
    835             choices=choices,
    836             required=required,
    837             help=help,
    838             metavar=metavar)
    839 
    840     def __call__(self, parser, namespace, values, option_string=None):
    841         setattr(namespace, self.dest, values)
    842 
    843 
    844 class _StoreConstAction(Action):
    845 
    846     def __init__(self,
    847                  option_strings,
    848                  dest,
    849                  const,
    850                  default=None,
    851                  required=False,
    852                  help=None,
    853                  metavar=None):
    854         super(_StoreConstAction, self).__init__(
    855             option_strings=option_strings,
    856             dest=dest,
    857             nargs=0,
    858             const=const,
    859             default=default,
    860             required=required,
    861             help=help)
    862 
    863     def __call__(self, parser, namespace, values, option_string=None):
    864         setattr(namespace, self.dest, self.const)
    865 
    866 
    867 class _StoreTrueAction(_StoreConstAction):
    868 
    869     def __init__(self,
    870                  option_strings,
    871                  dest,
    872                  default=False,
    873                  required=False,
    874                  help=None):
    875         super(_StoreTrueAction, self).__init__(
    876             option_strings=option_strings,
    877             dest=dest,
    878             const=True,
    879             default=default,
    880             required=required,
    881             help=help)
    882 
    883 
    884 class _StoreFalseAction(_StoreConstAction):
    885 
    886     def __init__(self,
    887                  option_strings,
    888                  dest,
    889                  default=True,
    890                  required=False,
    891                  help=None):
    892         super(_StoreFalseAction, self).__init__(
    893             option_strings=option_strings,
    894             dest=dest,
    895             const=False,
    896             default=default,
    897             required=required,
    898             help=help)
    899 
    900 
    901 class _AppendAction(Action):
    902 
    903     def __init__(self,
    904                  option_strings,
    905                  dest,
    906                  nargs=None,
    907                  const=None,
    908                  default=None,
    909                  type=None,
    910                  choices=None,
    911                  required=False,
    912                  help=None,
    913                  metavar=None):
    914         if nargs == 0:
    915             raise ValueError('nargs for append actions must be > 0; if arg '
    916                              'strings are not supplying the value to append, '
    917                              'the append const action may be more appropriate')
    918         if const is not None and nargs != OPTIONAL:
    919             raise ValueError('nargs must be %r to supply const' % OPTIONAL)
    920         super(_AppendAction, self).__init__(
    921             option_strings=option_strings,
    922             dest=dest,
    923             nargs=nargs,
    924             const=const,
    925             default=default,
    926             type=type,
    927             choices=choices,
    928             required=required,
    929             help=help,
    930             metavar=metavar)
    931 
    932     def __call__(self, parser, namespace, values, option_string=None):
    933         items = _copy.copy(_ensure_value(namespace, self.dest, []))
    934         items.append(values)
    935         setattr(namespace, self.dest, items)
    936 
    937 
    938 class _AppendConstAction(Action):
    939 
    940     def __init__(self,
    941                  option_strings,
    942                  dest,
    943                  const,
    944                  default=None,
    945                  required=False,
    946                  help=None,
    947                  metavar=None):
    948         super(_AppendConstAction, self).__init__(
    949             option_strings=option_strings,
    950             dest=dest,
    951             nargs=0,
    952             const=const,
    953             default=default,
    954             required=required,
    955             help=help,
    956             metavar=metavar)
    957 
    958     def __call__(self, parser, namespace, values, option_string=None):
    959         items = _copy.copy(_ensure_value(namespace, self.dest, []))
    960         items.append(self.const)
    961         setattr(namespace, self.dest, items)
    962 
    963 
    964 class _CountAction(Action):
    965 
    966     def __init__(self,
    967                  option_strings,
    968                  dest,
    969                  default=None,
    970                  required=False,
    971                  help=None):
    972         super(_CountAction, self).__init__(
    973             option_strings=option_strings,
    974             dest=dest,
    975             nargs=0,
    976             default=default,
    977             required=required,
    978             help=help)
    979 
    980     def __call__(self, parser, namespace, values, option_string=None):
    981         new_count = _ensure_value(namespace, self.dest, 0) + 1
    982         setattr(namespace, self.dest, new_count)
    983 
    984 
    985 class _HelpAction(Action):
    986 
    987     def __init__(self,
    988                  option_strings,
    989                  dest=SUPPRESS,
    990                  default=SUPPRESS,
    991                  help=None):
    992         super(_HelpAction, self).__init__(
    993             option_strings=option_strings,
    994             dest=dest,
    995             default=default,
    996             nargs=0,
    997             help=help)
    998 
    999     def __call__(self, parser, namespace, values, option_string=None):
   1000         parser.print_help()
   1001         parser.exit()
   1002 
   1003 
   1004 class _VersionAction(Action):
   1005 
   1006     def __init__(self,
   1007                  option_strings,
   1008                  version=None,
   1009                  dest=SUPPRESS,
   1010                  default=SUPPRESS,
   1011                  help="show program's version number and exit"):
   1012         super(_VersionAction, self).__init__(
   1013             option_strings=option_strings,
   1014             dest=dest,
   1015             default=default,
   1016             nargs=0,
   1017             help=help)
   1018         self.version = version
   1019 
   1020     def __call__(self, parser, namespace, values, option_string=None):
   1021         version = self.version
   1022         if version is None:
   1023             version = parser.version
   1024         formatter = parser._get_formatter()
   1025         formatter.add_text(version)
   1026         parser.exit(message=formatter.format_help())
   1027 
   1028 
   1029 class _SubParsersAction(Action):
   1030 
   1031     class _ChoicesPseudoAction(Action):
   1032 
   1033         def __init__(self, name, help):
   1034             sup = super(_SubParsersAction._ChoicesPseudoAction, self)
   1035             sup.__init__(option_strings=[], dest=name, help=help)
   1036 
   1037     def __init__(self,
   1038                  option_strings,
   1039                  prog,
   1040                  parser_class,
   1041                  dest=SUPPRESS,
   1042                  help=None,
   1043                  metavar=None):
   1044 
   1045         self._prog_prefix = prog
   1046         self._parser_class = parser_class
   1047         self._name_parser_map = _collections.OrderedDict()
   1048         self._choices_actions = []
   1049 
   1050         super(_SubParsersAction, self).__init__(
   1051             option_strings=option_strings,
   1052             dest=dest,
   1053             nargs=PARSER,
   1054             choices=self._name_parser_map,
   1055             help=help,
   1056             metavar=metavar)
   1057 
   1058     def add_parser(self, name, **kwargs):
   1059         # set prog from the existing prefix
   1060         if kwargs.get('prog') is None:
   1061             kwargs['prog'] = '%s %s' % (self._prog_prefix, name)
   1062 
   1063         # create a pseudo-action to hold the choice help
   1064         if 'help' in kwargs:
   1065             help = kwargs.pop('help')
   1066             choice_action = self._ChoicesPseudoAction(name, help)
   1067             self._choices_actions.append(choice_action)
   1068 
   1069         # create the parser and add it to the map
   1070         parser = self._parser_class(**kwargs)
   1071         self._name_parser_map[name] = parser
   1072         return parser
   1073 
   1074     def _get_subactions(self):
   1075         return self._choices_actions
   1076 
   1077     def __call__(self, parser, namespace, values, option_string=None):
   1078         parser_name = values[0]
   1079         arg_strings = values[1:]
   1080 
   1081         # set the parser name if requested
   1082         if self.dest is not SUPPRESS:
   1083             setattr(namespace, self.dest, parser_name)
   1084 
   1085         # select the parser
   1086         try:
   1087             parser = self._name_parser_map[parser_name]
   1088         except KeyError:
   1089             tup = parser_name, ', '.join(self._name_parser_map)
   1090             msg = _('unknown parser %r (choices: %s)') % tup
   1091             raise ArgumentError(self, msg)
   1092 
   1093         # parse all the remaining options into the namespace
   1094         # store any unrecognized options on the object, so that the top
   1095         # level parser can decide what to do with them
   1096 
   1097         # In case this subparser defines new defaults, we parse them
   1098         # in a new namespace object and then update the original
   1099         # namespace for the relevant parts.
   1100         subnamespace, arg_strings = parser.parse_known_args(arg_strings, None)
   1101         for key, value in vars(subnamespace).items():
   1102             setattr(namespace, key, value)
   1103 
   1104         if arg_strings:
   1105             vars(namespace).setdefault(_UNRECOGNIZED_ARGS_ATTR, [])
   1106             getattr(namespace, _UNRECOGNIZED_ARGS_ATTR).extend(arg_strings)
   1107 
   1108 
   1109 # ==============
   1110 # Type classes
   1111 # ==============
   1112 
   1113 class FileType(object):
   1114     """Factory for creating file object types
   1115 
   1116     Instances of FileType are typically passed as type= arguments to the
   1117     ArgumentParser add_argument() method.
   1118 
   1119     Keyword Arguments:
   1120         - mode -- A string indicating how the file is to be opened. Accepts the
   1121             same values as the builtin open() function.
   1122         - bufsize -- The file's desired buffer size. Accepts the same values as
   1123             the builtin open() function.
   1124     """
   1125 
   1126     def __init__(self, mode='r', bufsize=-1):
   1127         self._mode = mode
   1128         self._bufsize = bufsize
   1129 
   1130     def __call__(self, string):
   1131         # the special argument "-" means sys.std{in,out}
   1132         if string == '-':
   1133             if 'r' in self._mode:
   1134                 return _sys.stdin
   1135             elif 'w' in self._mode:
   1136                 return _sys.stdout
   1137             else:
   1138                 msg = _('argument "-" with mode %r') % self._mode
   1139                 raise ValueError(msg)
   1140 
   1141         # all other arguments are used as file names
   1142         try:
   1143             return open(string, self._mode, self._bufsize)
   1144         except IOError as e:
   1145             message = _("can't open '%s': %s")
   1146             raise ArgumentTypeError(message % (string, e))
   1147 
   1148     def __repr__(self):
   1149         args = self._mode, self._bufsize
   1150         args_str = ', '.join(repr(arg) for arg in args if arg != -1)
   1151         return '%s(%s)' % (type(self).__name__, args_str)
   1152 
   1153 # ===========================
   1154 # Optional and Positional Parsing
   1155 # ===========================
   1156 
   1157 class Namespace(_AttributeHolder):
   1158     """Simple object for storing attributes.
   1159 
   1160     Implements equality by attribute names and values, and provides a simple
   1161     string representation.
   1162     """
   1163 
   1164     def __init__(self, **kwargs):
   1165         for name in kwargs:
   1166             setattr(self, name, kwargs[name])
   1167 
   1168     __hash__ = None
   1169 
   1170     def __eq__(self, other):
   1171         if not isinstance(other, Namespace):
   1172             return NotImplemented
   1173         return vars(self) == vars(other)
   1174 
   1175     def __ne__(self, other):
   1176         if not isinstance(other, Namespace):
   1177             return NotImplemented
   1178         return not (self == other)
   1179 
   1180     def __contains__(self, key):
   1181         return key in self.__dict__
   1182 
   1183 
   1184 class _ActionsContainer(object):
   1185 
   1186     def __init__(self,
   1187                  description,
   1188                  prefix_chars,
   1189                  argument_default,
   1190                  conflict_handler):
   1191         super(_ActionsContainer, self).__init__()
   1192 
   1193         self.description = description
   1194         self.argument_default = argument_default
   1195         self.prefix_chars = prefix_chars
   1196         self.conflict_handler = conflict_handler
   1197 
   1198         # set up registries
   1199         self._registries = {}
   1200 
   1201         # register actions
   1202         self.register('action', None, _StoreAction)
   1203         self.register('action', 'store', _StoreAction)
   1204         self.register('action', 'store_const', _StoreConstAction)
   1205         self.register('action', 'store_true', _StoreTrueAction)
   1206         self.register('action', 'store_false', _StoreFalseAction)
   1207         self.register('action', 'append', _AppendAction)
   1208         self.register('action', 'append_const', _AppendConstAction)
   1209         self.register('action', 'count', _CountAction)
   1210         self.register('action', 'help', _HelpAction)
   1211         self.register('action', 'version', _VersionAction)
   1212         self.register('action', 'parsers', _SubParsersAction)
   1213 
   1214         # raise an exception if the conflict handler is invalid
   1215         self._get_handler()
   1216 
   1217         # action storage
   1218         self._actions = []
   1219         self._option_string_actions = {}
   1220 
   1221         # groups
   1222         self._action_groups = []
   1223         self._mutually_exclusive_groups = []
   1224 
   1225         # defaults storage
   1226         self._defaults = {}
   1227 
   1228         # determines whether an "option" looks like a negative number
   1229         self._negative_number_matcher = _re.compile(r'^-\d+$|^-\d*\.\d+$')
   1230 
   1231         # whether or not there are any optionals that look like negative
   1232         # numbers -- uses a list so it can be shared and edited
   1233         self._has_negative_number_optionals = []
   1234 
   1235     # ====================
   1236     # Registration methods
   1237     # ====================
   1238     def register(self, registry_name, value, object):
   1239         registry = self._registries.setdefault(registry_name, {})
   1240         registry[value] = object
   1241 
   1242     def _registry_get(self, registry_name, value, default=None):
   1243         return self._registries[registry_name].get(value, default)
   1244 
   1245     # ==================================
   1246     # Namespace default accessor methods
   1247     # ==================================
   1248     def set_defaults(self, **kwargs):
   1249         self._defaults.update(kwargs)
   1250 
   1251         # if these defaults match any existing arguments, replace
   1252         # the previous default on the object with the new one
   1253         for action in self._actions:
   1254             if action.dest in kwargs:
   1255                 action.default = kwargs[action.dest]
   1256 
   1257     def get_default(self, dest):
   1258         for action in self._actions:
   1259             if action.dest == dest and action.default is not None:
   1260                 return action.default
   1261         return self._defaults.get(dest, None)
   1262 
   1263 
   1264     # =======================
   1265     # Adding argument actions
   1266     # =======================
   1267     def add_argument(self, *args, **kwargs):
   1268         """
   1269         add_argument(dest, ..., name=value, ...)
   1270         add_argument(option_string, option_string, ..., name=value, ...)
   1271         """
   1272 
   1273         # if no positional args are supplied or only one is supplied and
   1274         # it doesn't look like an option string, parse a positional
   1275         # argument
   1276         chars = self.prefix_chars
   1277         if not args or len(args) == 1 and args[0][0] not in chars:
   1278             if args and 'dest' in kwargs:
   1279                 raise ValueError('dest supplied twice for positional argument')
   1280             kwargs = self._get_positional_kwargs(*args, **kwargs)
   1281 
   1282         # otherwise, we're adding an optional argument
   1283         else:
   1284             kwargs = self._get_optional_kwargs(*args, **kwargs)
   1285 
   1286         # if no default was supplied, use the parser-level default
   1287         if 'default' not in kwargs:
   1288             dest = kwargs['dest']
   1289             if dest in self._defaults:
   1290                 kwargs['default'] = self._defaults[dest]
   1291             elif self.argument_default is not None:
   1292                 kwargs['default'] = self.argument_default
   1293 
   1294         # create the action object, and add it to the parser
   1295         action_class = self._pop_action_class(kwargs)
   1296         if not _callable(action_class):
   1297             raise ValueError('unknown action "%s"' % (action_class,))
   1298         action = action_class(**kwargs)
   1299 
   1300         # raise an error if the action type is not callable
   1301         type_func = self._registry_get('type', action.type, action.type)
   1302         if not _callable(type_func):
   1303             raise ValueError('%r is not callable' % (type_func,))
   1304 
   1305         # raise an error if the metavar does not match the type
   1306         if hasattr(self, "_get_formatter"):
   1307             try:
   1308                 self._get_formatter()._format_args(action, None)
   1309             except TypeError:
   1310                 raise ValueError("length of metavar tuple does not match nargs")
   1311 
   1312         return self._add_action(action)
   1313 
   1314     def add_argument_group(self, *args, **kwargs):
   1315         group = _ArgumentGroup(self, *args, **kwargs)
   1316         self._action_groups.append(group)
   1317         return group
   1318 
   1319     def add_mutually_exclusive_group(self, **kwargs):
   1320         group = _MutuallyExclusiveGroup(self, **kwargs)
   1321         self._mutually_exclusive_groups.append(group)
   1322         return group
   1323 
   1324     def _add_action(self, action):
   1325         # resolve any conflicts
   1326         self._check_conflict(action)
   1327 
   1328         # add to actions list
   1329         self._actions.append(action)
   1330         action.container = self
   1331 
   1332         # index the action by any option strings it has
   1333         for option_string in action.option_strings:
   1334             self._option_string_actions[option_string] = action
   1335 
   1336         # set the flag if any option strings look like negative numbers
   1337         for option_string in action.option_strings:
   1338             if self._negative_number_matcher.match(option_string):
   1339                 if not self._has_negative_number_optionals:
   1340                     self._has_negative_number_optionals.append(True)
   1341 
   1342         # return the created action
   1343         return action
   1344 
   1345     def _remove_action(self, action):
   1346         self._actions.remove(action)
   1347 
   1348     def _add_container_actions(self, container):
   1349         # collect groups by titles
   1350         title_group_map = {}
   1351         for group in self._action_groups:
   1352             if group.title in title_group_map:
   1353                 msg = _('cannot merge actions - two groups are named %r')
   1354                 raise ValueError(msg % (group.title))
   1355             title_group_map[group.title] = group
   1356 
   1357         # map each action to its group
   1358         group_map = {}
   1359         for group in container._action_groups:
   1360 
   1361             # if a group with the title exists, use that, otherwise
   1362             # create a new group matching the container's group
   1363             if group.title not in title_group_map:
   1364                 title_group_map[group.title] = self.add_argument_group(
   1365                     title=group.title,
   1366                     description=group.description,
   1367                     conflict_handler=group.conflict_handler)
   1368 
   1369             # map the actions to their new group
   1370             for action in group._group_actions:
   1371                 group_map[action] = title_group_map[group.title]
   1372 
   1373         # add container's mutually exclusive groups
   1374         # NOTE: if add_mutually_exclusive_group ever gains title= and
   1375         # description= then this code will need to be expanded as above
   1376         for group in container._mutually_exclusive_groups:
   1377             mutex_group = self.add_mutually_exclusive_group(
   1378                 required=group.required)
   1379 
   1380             # map the actions to their new mutex group
   1381             for action in group._group_actions:
   1382                 group_map[action] = mutex_group
   1383 
   1384         # add all actions to this container or their group
   1385         for action in container._actions:
   1386             group_map.get(action, self)._add_action(action)
   1387 
   1388     def _get_positional_kwargs(self, dest, **kwargs):
   1389         # make sure required is not specified
   1390         if 'required' in kwargs:
   1391             msg = _("'required' is an invalid argument for positionals")
   1392             raise TypeError(msg)
   1393 
   1394         # mark positional arguments as required if at least one is
   1395         # always required
   1396         if kwargs.get('nargs') not in [OPTIONAL, ZERO_OR_MORE]:
   1397             kwargs['required'] = True
   1398         if kwargs.get('nargs') == ZERO_OR_MORE and 'default' not in kwargs:
   1399             kwargs['required'] = True
   1400 
   1401         # return the keyword arguments with no option strings
   1402         return dict(kwargs, dest=dest, option_strings=[])
   1403 
   1404     def _get_optional_kwargs(self, *args, **kwargs):
   1405         # determine short and long option strings
   1406         option_strings = []
   1407         long_option_strings = []
   1408         for option_string in args:
   1409             # error on strings that don't start with an appropriate prefix
   1410             if not option_string[0] in self.prefix_chars:
   1411                 msg = _('invalid option string %r: '
   1412                         'must start with a character %r')
   1413                 tup = option_string, self.prefix_chars
   1414                 raise ValueError(msg % tup)
   1415 
   1416             # strings starting with two prefix characters are long options
   1417             option_strings.append(option_string)
   1418             if option_string[0] in self.prefix_chars:
   1419                 if len(option_string) > 1:
   1420                     if option_string[1] in self.prefix_chars:
   1421                         long_option_strings.append(option_string)
   1422 
   1423         # infer destination, '--foo-bar' -> 'foo_bar' and '-x' -> 'x'
   1424         dest = kwargs.pop('dest', None)
   1425         if dest is None:
   1426             if long_option_strings:
   1427                 dest_option_string = long_option_strings[0]
   1428             else:
   1429                 dest_option_string = option_strings[0]
   1430             dest = dest_option_string.lstrip(self.prefix_chars)
   1431             if not dest:
   1432                 msg = _('dest= is required for options like %r')
   1433                 raise ValueError(msg % option_string)
   1434             dest = dest.replace('-', '_')
   1435 
   1436         # return the updated keyword arguments
   1437         return dict(kwargs, dest=dest, option_strings=option_strings)
   1438 
   1439     def _pop_action_class(self, kwargs, default=None):
   1440         action = kwargs.pop('action', default)
   1441         return self._registry_get('action', action, action)
   1442 
   1443     def _get_handler(self):
   1444         # determine function from conflict handler string
   1445         handler_func_name = '_handle_conflict_%s' % self.conflict_handler
   1446         try:
   1447             return getattr(self, handler_func_name)
   1448         except AttributeError:
   1449             msg = _('invalid conflict_resolution value: %r')
   1450             raise ValueError(msg % self.conflict_handler)
   1451 
   1452     def _check_conflict(self, action):
   1453 
   1454         # find all options that conflict with this option
   1455         confl_optionals = []
   1456         for option_string in action.option_strings:
   1457             if option_string in self._option_string_actions:
   1458                 confl_optional = self._option_string_actions[option_string]
   1459                 confl_optionals.append((option_string, confl_optional))
   1460 
   1461         # resolve any conflicts
   1462         if confl_optionals:
   1463             conflict_handler = self._get_handler()
   1464             conflict_handler(action, confl_optionals)
   1465 
   1466     def _handle_conflict_error(self, action, conflicting_actions):
   1467         message = _('conflicting option string(s): %s')
   1468         conflict_string = ', '.join([option_string
   1469                                      for option_string, action
   1470                                      in conflicting_actions])
   1471         raise ArgumentError(action, message % conflict_string)
   1472 
   1473     def _handle_conflict_resolve(self, action, conflicting_actions):
   1474 
   1475         # remove all conflicting options
   1476         for option_string, action in conflicting_actions:
   1477 
   1478             # remove the conflicting option
   1479             action.option_strings.remove(option_string)
   1480             self._option_string_actions.pop(option_string, None)
   1481 
   1482             # if the option now has no option string, remove it from the
   1483             # container holding it
   1484             if not action.option_strings:
   1485                 action.container._remove_action(action)
   1486 
   1487 
   1488 class _ArgumentGroup(_ActionsContainer):
   1489 
   1490     def __init__(self, container, title=None, description=None, **kwargs):
   1491         # add any missing keyword arguments by checking the container
   1492         update = kwargs.setdefault
   1493         update('conflict_handler', container.conflict_handler)
   1494         update('prefix_chars', container.prefix_chars)
   1495         update('argument_default', container.argument_default)
   1496         super_init = super(_ArgumentGroup, self).__init__
   1497         super_init(description=description, **kwargs)
   1498 
   1499         # group attributes
   1500         self.title = title
   1501         self._group_actions = []
   1502 
   1503         # share most attributes with the container
   1504         self._registries = container._registries
   1505         self._actions = container._actions
   1506         self._option_string_actions = container._option_string_actions
   1507         self._defaults = container._defaults
   1508         self._has_negative_number_optionals = \
   1509             container._has_negative_number_optionals
   1510         self._mutually_exclusive_groups = container._mutually_exclusive_groups
   1511 
   1512     def _add_action(self, action):
   1513         action = super(_ArgumentGroup, self)._add_action(action)
   1514         self._group_actions.append(action)
   1515         return action
   1516 
   1517     def _remove_action(self, action):
   1518         super(_ArgumentGroup, self)._remove_action(action)
   1519         self._group_actions.remove(action)
   1520 
   1521 
   1522 class _MutuallyExclusiveGroup(_ArgumentGroup):
   1523 
   1524     def __init__(self, container, required=False):
   1525         super(_MutuallyExclusiveGroup, self).__init__(container)
   1526         self.required = required
   1527         self._container = container
   1528 
   1529     def _add_action(self, action):
   1530         if action.required:
   1531             msg = _('mutually exclusive arguments must be optional')
   1532             raise ValueError(msg)
   1533         action = self._container._add_action(action)
   1534         self._group_actions.append(action)
   1535         return action
   1536 
   1537     def _remove_action(self, action):
   1538         self._container._remove_action(action)
   1539         self._group_actions.remove(action)
   1540 
   1541 
   1542 class ArgumentParser(_AttributeHolder, _ActionsContainer):
   1543     """Object for parsing command line strings into Python objects.
   1544 
   1545     Keyword Arguments:
   1546         - prog -- The name of the program (default: sys.argv[0])
   1547         - usage -- A usage message (default: auto-generated from arguments)
   1548         - description -- A description of what the program does
   1549         - epilog -- Text following the argument descriptions
   1550         - parents -- Parsers whose arguments should be copied into this one
   1551         - formatter_class -- HelpFormatter class for printing help messages
   1552         - prefix_chars -- Characters that prefix optional arguments
   1553         - fromfile_prefix_chars -- Characters that prefix files containing
   1554             additional arguments
   1555         - argument_default -- The default value for all arguments
   1556         - conflict_handler -- String indicating how to handle conflicts
   1557         - add_help -- Add a -h/-help option
   1558     """
   1559 
   1560     def __init__(self,
   1561                  prog=None,
   1562                  usage=None,
   1563                  description=None,
   1564                  epilog=None,
   1565                  version=None,
   1566                  parents=[],
   1567                  formatter_class=HelpFormatter,
   1568                  prefix_chars='-',
   1569                  fromfile_prefix_chars=None,
   1570                  argument_default=None,
   1571                  conflict_handler='error',
   1572                  add_help=True):
   1573 
   1574         if version is not None:
   1575             import warnings
   1576             warnings.warn(
   1577                 """The "version" argument to ArgumentParser is deprecated. """
   1578                 """Please use """
   1579                 """"add_argument(..., action='version', version="N", ...)" """
   1580                 """instead""", DeprecationWarning)
   1581 
   1582         superinit = super(ArgumentParser, self).__init__
   1583         superinit(description=description,
   1584                   prefix_chars=prefix_chars,
   1585                   argument_default=argument_default,
   1586                   conflict_handler=conflict_handler)
   1587 
   1588         # default setting for prog
   1589         if prog is None:
   1590             prog = _os.path.basename(_sys.argv[0])
   1591 
   1592         self.prog = prog
   1593         self.usage = usage
   1594         self.epilog = epilog
   1595         self.version = version
   1596         self.formatter_class = formatter_class
   1597         self.fromfile_prefix_chars = fromfile_prefix_chars
   1598         self.add_help = add_help
   1599 
   1600         add_group = self.add_argument_group
   1601         self._positionals = add_group(_('positional arguments'))
   1602         self._optionals = add_group(_('optional arguments'))
   1603         self._subparsers = None
   1604 
   1605         # register types
   1606         def identity(string):
   1607             return string
   1608         self.register('type', None, identity)
   1609 
   1610         # add help and version arguments if necessary
   1611         # (using explicit default to override global argument_default)
   1612         default_prefix = '-' if '-' in prefix_chars else prefix_chars[0]
   1613         if self.add_help:
   1614             self.add_argument(
   1615                 default_prefix+'h', default_prefix*2+'help',
   1616                 action='help', default=SUPPRESS,
   1617                 help=_('show this help message and exit'))
   1618         if self.version:
   1619             self.add_argument(
   1620                 default_prefix+'v', default_prefix*2+'version',
   1621                 action='version', default=SUPPRESS,
   1622                 version=self.version,
   1623                 help=_("show program's version number and exit"))
   1624 
   1625         # add parent arguments and defaults
   1626         for parent in parents:
   1627             self._add_container_actions(parent)
   1628             try:
   1629                 defaults = parent._defaults
   1630             except AttributeError:
   1631                 pass
   1632             else:
   1633                 self._defaults.update(defaults)
   1634 
   1635     # =======================
   1636     # Pretty __repr__ methods
   1637     # =======================
   1638     def _get_kwargs(self):
   1639         names = [
   1640             'prog',
   1641             'usage',
   1642             'description',
   1643             'version',
   1644             'formatter_class',
   1645             'conflict_handler',
   1646             'add_help',
   1647         ]
   1648         return [(name, getattr(self, name)) for name in names]
   1649 
   1650     # ==================================
   1651     # Optional/Positional adding methods
   1652     # ==================================
   1653     def add_subparsers(self, **kwargs):
   1654         if self._subparsers is not None:
   1655             self.error(_('cannot have multiple subparser arguments'))
   1656 
   1657         # add the parser class to the arguments if it's not present
   1658         kwargs.setdefault('parser_class', type(self))
   1659 
   1660         if 'title' in kwargs or 'description' in kwargs:
   1661             title = _(kwargs.pop('title', 'subcommands'))
   1662             description = _(kwargs.pop('description', None))
   1663             self._subparsers = self.add_argument_group(title, description)
   1664         else:
   1665             self._subparsers = self._positionals
   1666 
   1667         # prog defaults to the usage message of this parser, skipping
   1668         # optional arguments and with no "usage:" prefix
   1669         if kwargs.get('prog') is None:
   1670             formatter = self._get_formatter()
   1671             positionals = self._get_positional_actions()
   1672             groups = self._mutually_exclusive_groups
   1673             formatter.add_usage(self.usage, positionals, groups, '')
   1674             kwargs['prog'] = formatter.format_help().strip()
   1675 
   1676         # create the parsers action and add it to the positionals list
   1677         parsers_class = self._pop_action_class(kwargs, 'parsers')
   1678         action = parsers_class(option_strings=[], **kwargs)
   1679         self._subparsers._add_action(action)
   1680 
   1681         # return the created parsers action
   1682         return action
   1683 
   1684     def _add_action(self, action):
   1685         if action.option_strings:
   1686             self._optionals._add_action(action)
   1687         else:
   1688             self._positionals._add_action(action)
   1689         return action
   1690 
   1691     def _get_optional_actions(self):
   1692         return [action
   1693                 for action in self._actions
   1694                 if action.option_strings]
   1695 
   1696     def _get_positional_actions(self):
   1697         return [action
   1698                 for action in self._actions
   1699                 if not action.option_strings]
   1700 
   1701     # =====================================
   1702     # Command line argument parsing methods
   1703     # =====================================
   1704     def parse_args(self, args=None, namespace=None):
   1705         args, argv = self.parse_known_args(args, namespace)
   1706         if argv:
   1707             msg = _('unrecognized arguments: %s')
   1708             self.error(msg % ' '.join(argv))
   1709         return args
   1710 
   1711     def parse_known_args(self, args=None, namespace=None):
   1712         if args is None:
   1713             # args default to the system args
   1714             args = _sys.argv[1:]
   1715         else:
   1716             # make sure that args are mutable
   1717             args = list(args)
   1718 
   1719         # default Namespace built from parser defaults
   1720         if namespace is None:
   1721             namespace = Namespace()
   1722 
   1723         # add any action defaults that aren't present
   1724         for action in self._actions:
   1725             if action.dest is not SUPPRESS:
   1726                 if not hasattr(namespace, action.dest):
   1727                     if action.default is not SUPPRESS:
   1728                         setattr(namespace, action.dest, action.default)
   1729 
   1730         # add any parser defaults that aren't present
   1731         for dest in self._defaults:
   1732             if not hasattr(namespace, dest):
   1733                 setattr(namespace, dest, self._defaults[dest])
   1734 
   1735         # parse the arguments and exit if there are any errors
   1736         try:
   1737             namespace, args = self._parse_known_args(args, namespace)
   1738             if hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR):
   1739                 args.extend(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR))
   1740                 delattr(namespace, _UNRECOGNIZED_ARGS_ATTR)
   1741             return namespace, args
   1742         except ArgumentError:
   1743             err = _sys.exc_info()[1]
   1744             self.error(str(err))
   1745 
   1746     def _parse_known_args(self, arg_strings, namespace):
   1747         # replace arg strings that are file references
   1748         if self.fromfile_prefix_chars is not None:
   1749             arg_strings = self._read_args_from_files(arg_strings)
   1750 
   1751         # map all mutually exclusive arguments to the other arguments
   1752         # they can't occur with
   1753         action_conflicts = {}
   1754         for mutex_group in self._mutually_exclusive_groups:
   1755             group_actions = mutex_group._group_actions
   1756             for i, mutex_action in enumerate(mutex_group._group_actions):
   1757                 conflicts = action_conflicts.setdefault(mutex_action, [])
   1758                 conflicts.extend(group_actions[:i])
   1759                 conflicts.extend(group_actions[i + 1:])
   1760 
   1761         # find all option indices, and determine the arg_string_pattern
   1762         # which has an 'O' if there is an option at an index,
   1763         # an 'A' if there is an argument, or a '-' if there is a '--'
   1764         option_string_indices = {}
   1765         arg_string_pattern_parts = []
   1766         arg_strings_iter = iter(arg_strings)
   1767         for i, arg_string in enumerate(arg_strings_iter):
   1768 
   1769             # all args after -- are non-options
   1770             if arg_string == '--':
   1771                 arg_string_pattern_parts.append('-')
   1772                 for arg_string in arg_strings_iter:
   1773                     arg_string_pattern_parts.append('A')
   1774 
   1775             # otherwise, add the arg to the arg strings
   1776             # and note the index if it was an option
   1777             else:
   1778                 option_tuple = self._parse_optional(arg_string)
   1779                 if option_tuple is None:
   1780                     pattern = 'A'
   1781                 else:
   1782                     option_string_indices[i] = option_tuple
   1783                     pattern = 'O'
   1784                 arg_string_pattern_parts.append(pattern)
   1785 
   1786         # join the pieces together to form the pattern
   1787         arg_strings_pattern = ''.join(arg_string_pattern_parts)
   1788 
   1789         # converts arg strings to the appropriate and then takes the action
   1790         seen_actions = set()
   1791         seen_non_default_actions = set()
   1792 
   1793         def take_action(action, argument_strings, option_string=None):
   1794             seen_actions.add(action)
   1795             argument_values = self._get_values(action, argument_strings)
   1796 
   1797             # error if this argument is not allowed with other previously
   1798             # seen arguments, assuming that actions that use the default
   1799             # value don't really count as "present"
   1800             if argument_values is not action.default:
   1801                 seen_non_default_actions.add(action)
   1802                 for conflict_action in action_conflicts.get(action, []):
   1803                     if conflict_action in seen_non_default_actions:
   1804                         msg = _('not allowed with argument %s')
   1805                         action_name = _get_action_name(conflict_action)
   1806                         raise ArgumentError(action, msg % action_name)
   1807 
   1808             # take the action if we didn't receive a SUPPRESS value
   1809             # (e.g. from a default)
   1810             if argument_values is not SUPPRESS:
   1811                 action(self, namespace, argument_values, option_string)
   1812 
   1813         # function to convert arg_strings into an optional action
   1814         def consume_optional(start_index):
   1815 
   1816             # get the optional identified at this index
   1817             option_tuple = option_string_indices[start_index]
   1818             action, option_string, explicit_arg = option_tuple
   1819 
   1820             # identify additional optionals in the same arg string
   1821             # (e.g. -xyz is the same as -x -y -z if no args are required)
   1822             match_argument = self._match_argument
   1823             action_tuples = []
   1824             while True:
   1825 
   1826                 # if we found no optional action, skip it
   1827                 if action is None:
   1828                     extras.append(arg_strings[start_index])
   1829                     return start_index + 1
   1830 
   1831                 # if there is an explicit argument, try to match the
   1832                 # optional's string arguments to only this
   1833                 if explicit_arg is not None:
   1834                     arg_count = match_argument(action, 'A')
   1835 
   1836                     # if the action is a single-dash option and takes no
   1837                     # arguments, try to parse more single-dash options out
   1838                     # of the tail of the option string
   1839                     chars = self.prefix_chars
   1840                     if arg_count == 0 and option_string[1] not in chars:
   1841                         action_tuples.append((action, [], option_string))
   1842                         char = option_string[0]
   1843                         option_string = char + explicit_arg[0]
   1844                         new_explicit_arg = explicit_arg[1:] or None
   1845                         optionals_map = self._option_string_actions
   1846                         if option_string in optionals_map:
   1847                             action = optionals_map[option_string]
   1848                             explicit_arg = new_explicit_arg
   1849                         else:
   1850                             msg = _('ignored explicit argument %r')
   1851                             raise ArgumentError(action, msg % explicit_arg)
   1852 
   1853                     # if the action expect exactly one argument, we've
   1854                     # successfully matched the option; exit the loop
   1855                     elif arg_count == 1:
   1856                         stop = start_index + 1
   1857                         args = [explicit_arg]
   1858                         action_tuples.append((action, args, option_string))
   1859                         break
   1860 
   1861                     # error if a double-dash option did not use the
   1862                     # explicit argument
   1863                     else:
   1864                         msg = _('ignored explicit argument %r')
   1865                         raise ArgumentError(action, msg % explicit_arg)
   1866 
   1867                 # if there is no explicit argument, try to match the
   1868                 # optional's string arguments with the following strings
   1869                 # if successful, exit the loop
   1870                 else:
   1871                     start = start_index + 1
   1872                     selected_patterns = arg_strings_pattern[start:]
   1873                     arg_count = match_argument(action, selected_patterns)
   1874                     stop = start + arg_count
   1875                     args = arg_strings[start:stop]
   1876                     action_tuples.append((action, args, option_string))
   1877                     break
   1878 
   1879             # add the Optional to the list and return the index at which
   1880             # the Optional's string args stopped
   1881             assert action_tuples
   1882             for action, args, option_string in action_tuples:
   1883                 take_action(action, args, option_string)
   1884             return stop
   1885 
   1886         # the list of Positionals left to be parsed; this is modified
   1887         # by consume_positionals()
   1888         positionals = self._get_positional_actions()
   1889 
   1890         # function to convert arg_strings into positional actions
   1891         def consume_positionals(start_index):
   1892             # match as many Positionals as possible
   1893             match_partial = self._match_arguments_partial
   1894             selected_pattern = arg_strings_pattern[start_index:]
   1895             arg_counts = match_partial(positionals, selected_pattern)
   1896 
   1897             # slice off the appropriate arg strings for each Positional
   1898             # and add the Positional and its args to the list
   1899             for action, arg_count in zip(positionals, arg_counts):
   1900                 args = arg_strings[start_index: start_index + arg_count]
   1901                 start_index += arg_count
   1902                 take_action(action, args)
   1903 
   1904             # slice off the Positionals that we just parsed and return the
   1905             # index at which the Positionals' string args stopped
   1906             positionals[:] = positionals[len(arg_counts):]
   1907             return start_index
   1908 
   1909         # consume Positionals and Optionals alternately, until we have
   1910         # passed the last option string
   1911         extras = []
   1912         start_index = 0
   1913         if option_string_indices:
   1914             max_option_string_index = max(option_string_indices)
   1915         else:
   1916             max_option_string_index = -1
   1917         while start_index <= max_option_string_index:
   1918 
   1919             # consume any Positionals preceding the next option
   1920             next_option_string_index = min([
   1921                 index
   1922                 for index in option_string_indices
   1923                 if index >= start_index])
   1924             if start_index != next_option_string_index:
   1925                 positionals_end_index = consume_positionals(start_index)
   1926 
   1927                 # only try to parse the next optional if we didn't consume
   1928                 # the option string during the positionals parsing
   1929                 if positionals_end_index > start_index:
   1930                     start_index = positionals_end_index
   1931                     continue
   1932                 else:
   1933                     start_index = positionals_end_index
   1934 
   1935             # if we consumed all the positionals we could and we're not
   1936             # at the index of an option string, there were extra arguments
   1937             if start_index not in option_string_indices:
   1938                 strings = arg_strings[start_index:next_option_string_index]
   1939                 extras.extend(strings)
   1940                 start_index = next_option_string_index
   1941 
   1942             # consume the next optional and any arguments for it
   1943             start_index = consume_optional(start_index)
   1944 
   1945         # consume any positionals following the last Optional
   1946         stop_index = consume_positionals(start_index)
   1947 
   1948         # if we didn't consume all the argument strings, there were extras
   1949         extras.extend(arg_strings[stop_index:])
   1950 
   1951         # if we didn't use all the Positional objects, there were too few
   1952         # arg strings supplied.
   1953         if positionals:
   1954             self.error(_('too few arguments'))
   1955 
   1956         # make sure all required actions were present, and convert defaults.
   1957         for action in self._actions:
   1958             if action not in seen_actions:
   1959                 if action.required:
   1960                     name = _get_action_name(action)
   1961                     self.error(_('argument %s is required') % name)
   1962                 else:
   1963                     # Convert action default now instead of doing it before
   1964                     # parsing arguments to avoid calling convert functions
   1965                     # twice (which may fail) if the argument was given, but
   1966                     # only if it was defined already in the namespace
   1967                     if (action.default is not None and
   1968                             isinstance(action.default, basestring) and
   1969                             hasattr(namespace, action.dest) and
   1970                             action.default is getattr(namespace, action.dest)):
   1971                         setattr(namespace, action.dest,
   1972                                 self._get_value(action, action.default))
   1973 
   1974         # make sure all required groups had one option present
   1975         for group in self._mutually_exclusive_groups:
   1976             if group.required:
   1977                 for action in group._group_actions:
   1978                     if action in seen_non_default_actions:
   1979                         break
   1980 
   1981                 # if no actions were used, report the error
   1982                 else:
   1983                     names = [_get_action_name(action)
   1984                              for action in group._group_actions
   1985                              if action.help is not SUPPRESS]
   1986                     msg = _('one of the arguments %s is required')
   1987                     self.error(msg % ' '.join(names))
   1988 
   1989         # return the updated namespace and the extra arguments
   1990         return namespace, extras
   1991 
   1992     def _read_args_from_files(self, arg_strings):
   1993         # expand arguments referencing files
   1994         new_arg_strings = []
   1995         for arg_string in arg_strings:
   1996 
   1997             # for regular arguments, just add them back into the list
   1998             if not arg_string or arg_string[0] not in self.fromfile_prefix_chars:
   1999                 new_arg_strings.append(arg_string)
   2000 
   2001             # replace arguments referencing files with the file content
   2002             else:
   2003                 try:
   2004                     args_file = open(arg_string[1:])
   2005                     try:
   2006                         arg_strings = []
   2007                         for arg_line in args_file.read().splitlines():
   2008                             for arg in self.convert_arg_line_to_args(arg_line):
   2009                                 arg_strings.append(arg)
   2010                         arg_strings = self._read_args_from_files(arg_strings)
   2011                         new_arg_strings.extend(arg_strings)
   2012                     finally:
   2013                         args_file.close()
   2014                 except IOError:
   2015                     err = _sys.exc_info()[1]
   2016                     self.error(str(err))
   2017 
   2018         # return the modified argument list
   2019         return new_arg_strings
   2020 
   2021     def convert_arg_line_to_args(self, arg_line):
   2022         return [arg_line]
   2023 
   2024     def _match_argument(self, action, arg_strings_pattern):
   2025         # match the pattern for this action to the arg strings
   2026         nargs_pattern = self._get_nargs_pattern(action)
   2027         match = _re.match(nargs_pattern, arg_strings_pattern)
   2028 
   2029         # raise an exception if we weren't able to find a match
   2030         if match is None:
   2031             nargs_errors = {
   2032                 None: _('expected one argument'),
   2033                 OPTIONAL: _('expected at most one argument'),
   2034                 ONE_OR_MORE: _('expected at least one argument'),
   2035             }
   2036             default = _('expected %s argument(s)') % action.nargs
   2037             msg = nargs_errors.get(action.nargs, default)
   2038             raise ArgumentError(action, msg)
   2039 
   2040         # return the number of arguments matched
   2041         return len(match.group(1))
   2042 
   2043     def _match_arguments_partial(self, actions, arg_strings_pattern):
   2044         # progressively shorten the actions list by slicing off the
   2045         # final actions until we find a match
   2046         result = []
   2047         for i in range(len(actions), 0, -1):
   2048             actions_slice = actions[:i]
   2049             pattern = ''.join([self._get_nargs_pattern(action)
   2050                                for action in actions_slice])
   2051             match = _re.match(pattern, arg_strings_pattern)
   2052             if match is not None:
   2053                 result.extend([len(string) for string in match.groups()])
   2054                 break
   2055 
   2056         # return the list of arg string counts
   2057         return result
   2058 
   2059     def _parse_optional(self, arg_string):
   2060         # if it's an empty string, it was meant to be a positional
   2061         if not arg_string:
   2062             return None
   2063 
   2064         # if it doesn't start with a prefix, it was meant to be positional
   2065         if not arg_string[0] in self.prefix_chars:
   2066             return None
   2067 
   2068         # if the option string is present in the parser, return the action
   2069         if arg_string in self._option_string_actions:
   2070             action = self._option_string_actions[arg_string]
   2071             return action, arg_string, None
   2072 
   2073         # if it's just a single character, it was meant to be positional
   2074         if len(arg_string) == 1:
   2075             return None
   2076 
   2077         # if the option string before the "=" is present, return the action
   2078         if '=' in arg_string:
   2079             option_string, explicit_arg = arg_string.split('=', 1)
   2080             if option_string in self._option_string_actions:
   2081                 action = self._option_string_actions[option_string]
   2082                 return action, option_string, explicit_arg
   2083 
   2084         # search through all possible prefixes of the option string
   2085         # and all actions in the parser for possible interpretations
   2086         option_tuples = self._get_option_tuples(arg_string)
   2087 
   2088         # if multiple actions match, the option string was ambiguous
   2089         if len(option_tuples) > 1:
   2090             options = ', '.join([option_string
   2091                 for action, option_string, explicit_arg in option_tuples])
   2092             tup = arg_string, options
   2093             self.error(_('ambiguous option: %s could match %s') % tup)
   2094 
   2095         # if exactly one action matched, this segmentation is good,
   2096         # so return the parsed action
   2097         elif len(option_tuples) == 1:
   2098             option_tuple, = option_tuples
   2099             return option_tuple
   2100 
   2101         # if it was not found as an option, but it looks like a negative
   2102         # number, it was meant to be positional
   2103         # unless there are negative-number-like options
   2104         if self._negative_number_matcher.match(arg_string):
   2105             if not self._has_negative_number_optionals:
   2106                 return None
   2107 
   2108         # if it contains a space, it was meant to be a positional
   2109         if ' ' in arg_string:
   2110             return None
   2111 
   2112         # it was meant to be an optional but there is no such option
   2113         # in this parser (though it might be a valid option in a subparser)
   2114         return None, arg_string, None
   2115 
   2116     def _get_option_tuples(self, option_string):
   2117         result = []
   2118 
   2119         # option strings starting with two prefix characters are only
   2120         # split at the '='
   2121         chars = self.prefix_chars
   2122         if option_string[0] in chars and option_string[1] in chars:
   2123             if '=' in option_string:
   2124                 option_prefix, explicit_arg = option_string.split('=', 1)
   2125             else:
   2126                 option_prefix = option_string
   2127                 explicit_arg = None
   2128             for option_string in self._option_string_actions:
   2129                 if option_string.startswith(option_prefix):
   2130                     action = self._option_string_actions[option_string]
   2131                     tup = action, option_string, explicit_arg
   2132                     result.append(tup)
   2133 
   2134         # single character options can be concatenated with their arguments
   2135         # but multiple character options always have to have their argument
   2136         # separate
   2137         elif option_string[0] in chars and option_string[1] not in chars:
   2138             option_prefix = option_string
   2139             explicit_arg = None
   2140             short_option_prefix = option_string[:2]
   2141             short_explicit_arg = option_string[2:]
   2142 
   2143             for option_string in self._option_string_actions:
   2144                 if option_string == short_option_prefix:
   2145                     action = self._option_string_actions[option_string]
   2146                     tup = action, option_string, short_explicit_arg
   2147                     result.append(tup)
   2148                 elif option_string.startswith(option_prefix):
   2149                     action = self._option_string_actions[option_string]
   2150                     tup = action, option_string, explicit_arg
   2151                     result.append(tup)
   2152 
   2153         # shouldn't ever get here
   2154         else:
   2155             self.error(_('unexpected option string: %s') % option_string)
   2156 
   2157         # return the collected option tuples
   2158         return result
   2159 
   2160     def _get_nargs_pattern(self, action):
   2161         # in all examples below, we have to allow for '--' args
   2162         # which are represented as '-' in the pattern
   2163         nargs = action.nargs
   2164 
   2165         # the default (None) is assumed to be a single argument
   2166         if nargs is None:
   2167             nargs_pattern = '(-*A-*)'
   2168 
   2169         # allow zero or one arguments
   2170         elif nargs == OPTIONAL:
   2171             nargs_pattern = '(-*A?-*)'
   2172 
   2173         # allow zero or more arguments
   2174         elif nargs == ZERO_OR_MORE:
   2175             nargs_pattern = '(-*[A-]*)'
   2176 
   2177         # allow one or more arguments
   2178         elif nargs == ONE_OR_MORE:
   2179             nargs_pattern = '(-*A[A-]*)'
   2180 
   2181         # allow any number of options or arguments
   2182         elif nargs == REMAINDER:
   2183             nargs_pattern = '([-AO]*)'
   2184 
   2185         # allow one argument followed by any number of options or arguments
   2186         elif nargs == PARSER:
   2187             nargs_pattern = '(-*A[-AO]*)'
   2188 
   2189         # all others should be integers
   2190         else:
   2191             nargs_pattern = '(-*%s-*)' % '-*'.join('A' * nargs)
   2192 
   2193         # if this is an optional action, -- is not allowed
   2194         if action.option_strings:
   2195             nargs_pattern = nargs_pattern.replace('-*', '')
   2196             nargs_pattern = nargs_pattern.replace('-', '')
   2197 
   2198         # return the pattern
   2199         return nargs_pattern
   2200 
   2201     # ========================
   2202     # Value conversion methods
   2203     # ========================
   2204     def _get_values(self, action, arg_strings):
   2205         # for everything but PARSER, REMAINDER args, strip out first '--'
   2206         if action.nargs not in [PARSER, REMAINDER]:
   2207             try:
   2208                 arg_strings.remove('--')
   2209             except ValueError:
   2210                 pass
   2211 
   2212         # optional argument produces a default when not present
   2213         if not arg_strings and action.nargs == OPTIONAL:
   2214             if action.option_strings:
   2215                 value = action.const
   2216             else:
   2217                 value = action.default
   2218             if isinstance(value, basestring):
   2219                 value = self._get_value(action, value)
   2220                 self._check_value(action, value)
   2221 
   2222         # when nargs='*' on a positional, if there were no command-line
   2223         # args, use the default if it is anything other than None
   2224         elif (not arg_strings and action.nargs == ZERO_OR_MORE and
   2225               not action.option_strings):
   2226             if action.default is not None:
   2227                 value = action.default
   2228             else:
   2229                 value = arg_strings
   2230             self._check_value(action, value)
   2231 
   2232         # single argument or optional argument produces a single value
   2233         elif len(arg_strings) == 1 and action.nargs in [None, OPTIONAL]:
   2234             arg_string, = arg_strings
   2235             value = self._get_value(action, arg_string)
   2236             self._check_value(action, value)
   2237 
   2238         # REMAINDER arguments convert all values, checking none
   2239         elif action.nargs == REMAINDER:
   2240             value = [self._get_value(action, v) for v in arg_strings]
   2241 
   2242         # PARSER arguments convert all values, but check only the first
   2243         elif action.nargs == PARSER:
   2244             value = [self._get_value(action, v) for v in arg_strings]
   2245             self._check_value(action, value[0])
   2246 
   2247         # all other types of nargs produce a list
   2248         else:
   2249             value = [self._get_value(action, v) for v in arg_strings]
   2250             for v in value:
   2251                 self._check_value(action, v)
   2252 
   2253         # return the converted value
   2254         return value
   2255 
   2256     def _get_value(self, action, arg_string):
   2257         type_func = self._registry_get('type', action.type, action.type)
   2258         if not _callable(type_func):
   2259             msg = _('%r is not callable')
   2260             raise ArgumentError(action, msg % type_func)
   2261 
   2262         # convert the value to the appropriate type
   2263         try:
   2264             result = type_func(arg_string)
   2265 
   2266         # ArgumentTypeErrors indicate errors
   2267         except ArgumentTypeError:
   2268             name = getattr(action.type, '__name__', repr(action.type))
   2269             msg = str(_sys.exc_info()[1])
   2270             raise ArgumentError(action, msg)
   2271 
   2272         # TypeErrors or ValueErrors also indicate errors
   2273         except (TypeError, ValueError):
   2274             name = getattr(action.type, '__name__', repr(action.type))
   2275             msg = _('invalid %s value: %r')
   2276             raise ArgumentError(action, msg % (name, arg_string))
   2277 
   2278         # return the converted value
   2279         return result
   2280 
   2281     def _check_value(self, action, value):
   2282         # converted value must be one of the choices (if specified)
   2283         if action.choices is not None and value not in action.choices:
   2284             tup = value, ', '.join(map(repr, action.choices))
   2285             msg = _('invalid choice: %r (choose from %s)') % tup
   2286             raise ArgumentError(action, msg)
   2287 
   2288     # =======================
   2289     # Help-formatting methods
   2290     # =======================
   2291     def format_usage(self):
   2292         formatter = self._get_formatter()
   2293         formatter.add_usage(self.usage, self._actions,
   2294                             self._mutually_exclusive_groups)
   2295         return formatter.format_help()
   2296 
   2297     def format_help(self):
   2298         formatter = self._get_formatter()
   2299 
   2300         # usage
   2301         formatter.add_usage(self.usage, self._actions,
   2302                             self._mutually_exclusive_groups)
   2303 
   2304         # description
   2305         formatter.add_text(self.description)
   2306 
   2307         # positionals, optionals and user-defined groups
   2308         for action_group in self._action_groups:
   2309             formatter.start_section(action_group.title)
   2310             formatter.add_text(action_group.description)
   2311             formatter.add_arguments(action_group._group_actions)
   2312             formatter.end_section()
   2313 
   2314         # epilog
   2315         formatter.add_text(self.epilog)
   2316 
   2317         # determine help from format above
   2318         return formatter.format_help()
   2319 
   2320     def format_version(self):
   2321         import warnings
   2322         warnings.warn(
   2323             'The format_version method is deprecated -- the "version" '
   2324             'argument to ArgumentParser is no longer supported.',
   2325             DeprecationWarning)
   2326         formatter = self._get_formatter()
   2327         formatter.add_text(self.version)
   2328         return formatter.format_help()
   2329 
   2330     def _get_formatter(self):
   2331         return self.formatter_class(prog=self.prog)
   2332 
   2333     # =====================
   2334     # Help-printing methods
   2335     # =====================
   2336     def print_usage(self, file=None):
   2337         if file is None:
   2338             file = _sys.stdout
   2339         self._print_message(self.format_usage(), file)
   2340 
   2341     def print_help(self, file=None):
   2342         if file is None:
   2343             file = _sys.stdout
   2344         self._print_message(self.format_help(), file)
   2345 
   2346     def print_version(self, file=None):
   2347         import warnings
   2348         warnings.warn(
   2349             'The print_version method is deprecated -- the "version" '
   2350             'argument to ArgumentParser is no longer supported.',
   2351             DeprecationWarning)
   2352         self._print_message(self.format_version(), file)
   2353 
   2354     def _print_message(self, message, file=None):
   2355         if message:
   2356             if file is None:
   2357                 file = _sys.stderr
   2358             file.write(message)
   2359 
   2360     # ===============
   2361     # Exiting methods
   2362     # ===============
   2363     def exit(self, status=0, message=None):
   2364         if message:
   2365             self._print_message(message, _sys.stderr)
   2366         _sys.exit(status)
   2367 
   2368     def error(self, message):
   2369         """error(message: string)
   2370 
   2371         Prints a usage message incorporating the message to stderr and
   2372         exits.
   2373 
   2374         If you override this in a subclass, it should not return -- it
   2375         should either exit or raise an exception.
   2376         """
   2377         self.print_usage(_sys.stderr)
   2378         self.exit(2, _('%s: error: %s\n') % (self.prog, message))
   2379