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