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