blob: e3a49e74fa8d17cd3939533dc6a11ed3ef213963 [file] [log] [blame]
Benjamin Peterson2b37fc42010-03-24 22:10:42 +00001# Author: Steven J. Bethard <steven.bethard@gmail.com>.
Raymond Hettinger496058f2019-08-29 21:04:37 -07002# New maintainer as of 29 August 2019: Raymond Hettinger <raymond.hettinger@gmail.com>
Benjamin Peterson698a18a2010-03-02 22:34:37 +00003
4"""Command-line parsing library
5
6This module is an optparse-inspired command-line parsing library that:
7
8 - handles both optional and positional arguments
9 - produces highly informative usage messages
10 - supports parsers that dispatch to sub-parsers
11
12The following is a simple usage example that sums integers from the
13command-line and writes the result to a file::
14
15 parser = argparse.ArgumentParser(
16 description='sum the integers at the command line')
17 parser.add_argument(
18 'integers', metavar='int', nargs='+', type=int,
19 help='an integer to be summed')
20 parser.add_argument(
21 '--log', default=sys.stdout, type=argparse.FileType('w'),
22 help='the file where the sum should be written')
23 args = parser.parse_args()
24 args.log.write('%s' % sum(args.integers))
25 args.log.close()
26
27The module contains the following public classes:
28
29 - ArgumentParser -- The main entry point for command-line parsing. As the
30 example above shows, the add_argument() method is used to populate
31 the parser with actions for optional and positional arguments. Then
32 the parse_args() method is invoked to convert the args at the
33 command-line into an object with attributes.
34
35 - ArgumentError -- The exception raised by ArgumentParser objects when
36 there are errors with the parser's actions. Errors raised while
37 parsing the command-line are caught by ArgumentParser and emitted
38 as command-line messages.
39
40 - FileType -- A factory for defining types of files to be created. As the
41 example above shows, instances of FileType are typically passed as
42 the type= argument of add_argument() calls.
43
44 - Action -- The base class for parser actions. Typically actions are
45 selected by passing strings like 'store_true' or 'append_const' to
46 the action= argument of add_argument(). However, for greater
47 customization of ArgumentParser actions, subclasses of Action may
48 be defined and passed as the action= argument.
49
50 - HelpFormatter, RawDescriptionHelpFormatter, RawTextHelpFormatter,
51 ArgumentDefaultsHelpFormatter -- Formatter classes which
52 may be passed as the formatter_class= argument to the
53 ArgumentParser constructor. HelpFormatter is the default,
54 RawDescriptionHelpFormatter and RawTextHelpFormatter tell the parser
55 not to change the formatting for help text, and
56 ArgumentDefaultsHelpFormatter adds information about argument defaults
57 to the help.
58
59All other classes in this module are considered implementation details.
60(Also note that HelpFormatter and RawDescriptionHelpFormatter are only
61considered public as object names -- the API of the formatter objects is
62still considered an implementation detail.)
63"""
64
65__version__ = '1.1'
66__all__ = [
67 'ArgumentParser',
68 'ArgumentError',
Steven Bethard72c55382010-11-01 15:23:12 +000069 'ArgumentTypeError',
Rémi Lapeyre6a517c62019-09-13 12:17:43 +020070 'BooleanOptionalAction',
Benjamin Peterson698a18a2010-03-02 22:34:37 +000071 'FileType',
72 'HelpFormatter',
Steven Bethard72c55382010-11-01 15:23:12 +000073 'ArgumentDefaultsHelpFormatter',
Benjamin Peterson698a18a2010-03-02 22:34:37 +000074 'RawDescriptionHelpFormatter',
75 'RawTextHelpFormatter',
Steven Bethard0331e902011-03-26 14:48:04 +010076 'MetavarTypeHelpFormatter',
Steven Bethard72c55382010-11-01 15:23:12 +000077 'Namespace',
78 'Action',
79 'ONE_OR_MORE',
80 'OPTIONAL',
81 'PARSER',
82 'REMAINDER',
83 'SUPPRESS',
84 'ZERO_OR_MORE',
Benjamin Peterson698a18a2010-03-02 22:34:37 +000085]
86
87
Benjamin Peterson698a18a2010-03-02 22:34:37 +000088import os as _os
89import re as _re
90import sys as _sys
Benjamin Peterson698a18a2010-03-02 22:34:37 +000091
Éric Araujo12159152010-12-04 17:31:49 +000092from gettext import gettext as _, ngettext
Benjamin Peterson698a18a2010-03-02 22:34:37 +000093
Benjamin Peterson698a18a2010-03-02 22:34:37 +000094SUPPRESS = '==SUPPRESS=='
95
96OPTIONAL = '?'
97ZERO_OR_MORE = '*'
98ONE_OR_MORE = '+'
99PARSER = 'A...'
100REMAINDER = '...'
Steven Bethardfca2e8a2010-11-02 12:47:22 +0000101_UNRECOGNIZED_ARGS_ATTR = '_unrecognized_args'
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000102
103# =============================
104# Utility functions and classes
105# =============================
106
107class _AttributeHolder(object):
108 """Abstract base class that provides __repr__.
109
110 The __repr__ method returns a string in the format::
111 ClassName(attr=name, attr=name, ...)
112 The attributes are determined either by a class-level attribute,
113 '_kwarg_names', or by inspecting the instance __dict__.
114 """
115
116 def __repr__(self):
117 type_name = type(self).__name__
118 arg_strings = []
Berker Peksag76b17142015-07-29 23:51:47 +0300119 star_args = {}
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000120 for arg in self._get_args():
121 arg_strings.append(repr(arg))
122 for name, value in self._get_kwargs():
Berker Peksag76b17142015-07-29 23:51:47 +0300123 if name.isidentifier():
124 arg_strings.append('%s=%r' % (name, value))
125 else:
126 star_args[name] = value
127 if star_args:
128 arg_strings.append('**%s' % repr(star_args))
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000129 return '%s(%s)' % (type_name, ', '.join(arg_strings))
130
131 def _get_kwargs(self):
Raymond Hettinger96819532020-05-17 18:53:01 -0700132 return list(self.__dict__.items())
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000133
134 def _get_args(self):
135 return []
136
137
Serhiy Storchaka81108372017-09-26 00:55:55 +0300138def _copy_items(items):
139 if items is None:
140 return []
141 # The copy module is used only in the 'append' and 'append_const'
142 # actions, and it is needed only when the default value isn't a list.
143 # Delay its import for speeding up the common case.
144 if type(items) is list:
145 return items[:]
146 import copy
147 return copy.copy(items)
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000148
149
150# ===============
151# Formatting Help
152# ===============
153
154class HelpFormatter(object):
155 """Formatter for generating usage messages and argument help strings.
156
157 Only the name of this class is considered a public API. All the methods
158 provided by the class are considered an implementation detail.
159 """
160
161 def __init__(self,
162 prog,
163 indent_increment=2,
164 max_help_position=24,
165 width=None):
166
167 # default setting for width
168 if width is None:
Raymond Hettingerb4e5eea2019-11-21 22:51:45 -0800169 import shutil
170 width = shutil.get_terminal_size().columns
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000171 width -= 2
172
173 self._prog = prog
174 self._indent_increment = indent_increment
Serhiy Storchakaf4511122014-01-09 23:14:27 +0200175 self._max_help_position = min(max_help_position,
176 max(width - 20, indent_increment * 2))
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000177 self._width = width
178
179 self._current_indent = 0
180 self._level = 0
181 self._action_max_length = 0
182
183 self._root_section = self._Section(self, None)
184 self._current_section = self._root_section
185
Xiang Zhang7fe28ad2017-01-22 14:37:22 +0800186 self._whitespace_matcher = _re.compile(r'\s+', _re.ASCII)
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000187 self._long_break_matcher = _re.compile(r'\n\n\n+')
188
189 # ===============================
190 # Section and indentation methods
191 # ===============================
192 def _indent(self):
193 self._current_indent += self._indent_increment
194 self._level += 1
195
196 def _dedent(self):
197 self._current_indent -= self._indent_increment
198 assert self._current_indent >= 0, 'Indent decreased below 0.'
199 self._level -= 1
200
201 class _Section(object):
202
203 def __init__(self, formatter, parent, heading=None):
204 self.formatter = formatter
205 self.parent = parent
206 self.heading = heading
207 self.items = []
208
209 def format_help(self):
210 # format the indented section
211 if self.parent is not None:
212 self.formatter._indent()
213 join = self.formatter._join_parts
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000214 item_help = join([func(*args) for func, args in self.items])
215 if self.parent is not None:
216 self.formatter._dedent()
217
218 # return nothing if the section was empty
219 if not item_help:
220 return ''
221
222 # add the heading if the section was non-empty
223 if self.heading is not SUPPRESS and self.heading is not None:
224 current_indent = self.formatter._current_indent
225 heading = '%*s%s:\n' % (current_indent, '', self.heading)
226 else:
227 heading = ''
228
229 # join the section-initial newline, the heading and the help
230 return join(['\n', heading, item_help, '\n'])
231
232 def _add_item(self, func, args):
233 self._current_section.items.append((func, args))
234
235 # ========================
236 # Message building methods
237 # ========================
238 def start_section(self, heading):
239 self._indent()
240 section = self._Section(self, self._current_section, heading)
241 self._add_item(section.format_help, [])
242 self._current_section = section
243
244 def end_section(self):
245 self._current_section = self._current_section.parent
246 self._dedent()
247
248 def add_text(self, text):
249 if text is not SUPPRESS and text is not None:
250 self._add_item(self._format_text, [text])
251
252 def add_usage(self, usage, actions, groups, prefix=None):
253 if usage is not SUPPRESS:
254 args = usage, actions, groups, prefix
255 self._add_item(self._format_usage, args)
256
257 def add_argument(self, action):
258 if action.help is not SUPPRESS:
259
260 # find all invocations
261 get_invocation = self._format_action_invocation
262 invocations = [get_invocation(action)]
263 for subaction in self._iter_indented_subactions(action):
264 invocations.append(get_invocation(subaction))
265
266 # update the maximum item length
Raymond Hettingerb4e5eea2019-11-21 22:51:45 -0800267 invocation_length = max(map(len, invocations))
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000268 action_length = invocation_length + self._current_indent
269 self._action_max_length = max(self._action_max_length,
270 action_length)
271
272 # add the item to the list
273 self._add_item(self._format_action, [action])
274
275 def add_arguments(self, actions):
276 for action in actions:
277 self.add_argument(action)
278
279 # =======================
280 # Help-formatting methods
281 # =======================
282 def format_help(self):
283 help = self._root_section.format_help()
284 if help:
285 help = self._long_break_matcher.sub('\n\n', help)
286 help = help.strip('\n') + '\n'
287 return help
288
289 def _join_parts(self, part_strings):
290 return ''.join([part
291 for part in part_strings
292 if part and part is not SUPPRESS])
293
294 def _format_usage(self, usage, actions, groups, prefix):
295 if prefix is None:
296 prefix = _('usage: ')
297
298 # if usage is specified, use that
299 if usage is not None:
300 usage = usage % dict(prog=self._prog)
301
302 # if no optionals or positionals are available, usage is just prog
303 elif usage is None and not actions:
304 usage = '%(prog)s' % dict(prog=self._prog)
305
306 # if optionals and positionals are available, calculate usage
307 elif usage is None:
308 prog = '%(prog)s' % dict(prog=self._prog)
309
310 # split optionals from positionals
311 optionals = []
312 positionals = []
313 for action in actions:
314 if action.option_strings:
315 optionals.append(action)
316 else:
317 positionals.append(action)
318
319 # build full usage string
320 format = self._format_actions_usage
321 action_usage = format(optionals + positionals, groups)
322 usage = ' '.join([s for s in [prog, action_usage] if s])
323
324 # wrap the usage parts if it's too long
325 text_width = self._width - self._current_indent
326 if len(prefix) + len(usage) > text_width:
327
328 # break usage into wrappable parts
wim glenn66f02aa2018-06-08 05:12:49 -0500329 part_regexp = (
330 r'\(.*?\)+(?=\s|$)|'
331 r'\[.*?\]+(?=\s|$)|'
332 r'\S+'
333 )
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000334 opt_usage = format(optionals, groups)
335 pos_usage = format(positionals, groups)
336 opt_parts = _re.findall(part_regexp, opt_usage)
337 pos_parts = _re.findall(part_regexp, pos_usage)
338 assert ' '.join(opt_parts) == opt_usage
339 assert ' '.join(pos_parts) == pos_usage
340
341 # helper for wrapping lines
342 def get_lines(parts, indent, prefix=None):
343 lines = []
344 line = []
345 if prefix is not None:
346 line_len = len(prefix) - 1
347 else:
348 line_len = len(indent) - 1
349 for part in parts:
Serhiy Storchakaf4511122014-01-09 23:14:27 +0200350 if line_len + 1 + len(part) > text_width and line:
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000351 lines.append(indent + ' '.join(line))
352 line = []
353 line_len = len(indent) - 1
354 line.append(part)
355 line_len += len(part) + 1
356 if line:
357 lines.append(indent + ' '.join(line))
358 if prefix is not None:
359 lines[0] = lines[0][len(indent):]
360 return lines
361
362 # if prog is short, follow it with optionals or positionals
363 if len(prefix) + len(prog) <= 0.75 * text_width:
364 indent = ' ' * (len(prefix) + len(prog) + 1)
365 if opt_parts:
366 lines = get_lines([prog] + opt_parts, indent, prefix)
367 lines.extend(get_lines(pos_parts, indent))
368 elif pos_parts:
369 lines = get_lines([prog] + pos_parts, indent, prefix)
370 else:
371 lines = [prog]
372
373 # if prog is long, put it on its own line
374 else:
375 indent = ' ' * len(prefix)
376 parts = opt_parts + pos_parts
377 lines = get_lines(parts, indent)
378 if len(lines) > 1:
379 lines = []
380 lines.extend(get_lines(opt_parts, indent))
381 lines.extend(get_lines(pos_parts, indent))
382 lines = [prog] + lines
383
384 # join lines into usage
385 usage = '\n'.join(lines)
386
387 # prefix with 'usage:'
388 return '%s%s\n\n' % (prefix, usage)
389
390 def _format_actions_usage(self, actions, groups):
391 # find group indices and identify actions in groups
Benjamin Peterson16f2fd02010-03-02 23:09:38 +0000392 group_actions = set()
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000393 inserts = {}
394 for group in groups:
395 try:
396 start = actions.index(group._group_actions[0])
397 except ValueError:
398 continue
399 else:
400 end = start + len(group._group_actions)
401 if actions[start:end] == group._group_actions:
402 for action in group._group_actions:
403 group_actions.add(action)
404 if not group.required:
Steven Bethard49998ee2010-11-01 16:29:26 +0000405 if start in inserts:
406 inserts[start] += ' ['
407 else:
408 inserts[start] = '['
Flavian Hautboisda27d9b2019-08-25 21:06:45 +0200409 if end in inserts:
410 inserts[end] += ']'
411 else:
412 inserts[end] = ']'
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000413 else:
Steven Bethard49998ee2010-11-01 16:29:26 +0000414 if start in inserts:
415 inserts[start] += ' ('
416 else:
417 inserts[start] = '('
Flavian Hautboisda27d9b2019-08-25 21:06:45 +0200418 if end in inserts:
419 inserts[end] += ')'
420 else:
421 inserts[end] = ')'
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000422 for i in range(start + 1, end):
423 inserts[i] = '|'
424
425 # collect all actions format strings
426 parts = []
427 for i, action in enumerate(actions):
428
429 # suppressed arguments are marked with None
430 # remove | separators for suppressed arguments
431 if action.help is SUPPRESS:
432 parts.append(None)
433 if inserts.get(i) == '|':
434 inserts.pop(i)
435 elif inserts.get(i + 1) == '|':
436 inserts.pop(i + 1)
437
438 # produce all arg strings
439 elif not action.option_strings:
Steven Bethard0331e902011-03-26 14:48:04 +0100440 default = self._get_default_metavar_for_positional(action)
441 part = self._format_args(action, default)
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000442
443 # if it's in a group, strip the outer []
444 if action in group_actions:
445 if part[0] == '[' and part[-1] == ']':
446 part = part[1:-1]
447
448 # add the action string to the list
449 parts.append(part)
450
451 # produce the first way to invoke the option in brackets
452 else:
453 option_string = action.option_strings[0]
454
455 # if the Optional doesn't take a value, format is:
456 # -s or --long
457 if action.nargs == 0:
Rémi Lapeyre6a517c62019-09-13 12:17:43 +0200458 part = action.format_usage()
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000459
460 # if the Optional takes a value, format is:
461 # -s ARGS or --long ARGS
462 else:
Steven Bethard0331e902011-03-26 14:48:04 +0100463 default = self._get_default_metavar_for_optional(action)
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000464 args_string = self._format_args(action, default)
465 part = '%s %s' % (option_string, args_string)
466
467 # make it look optional if it's not required or in a group
468 if not action.required and action not in group_actions:
469 part = '[%s]' % part
470
471 # add the action string to the list
472 parts.append(part)
473
474 # insert things at the necessary indices
Benjamin Peterson16f2fd02010-03-02 23:09:38 +0000475 for i in sorted(inserts, reverse=True):
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000476 parts[i:i] = [inserts[i]]
477
478 # join all the action items with spaces
479 text = ' '.join([item for item in parts if item is not None])
480
481 # clean up separators for mutually exclusive groups
482 open = r'[\[(]'
483 close = r'[\])]'
484 text = _re.sub(r'(%s) ' % open, r'\1', text)
485 text = _re.sub(r' (%s)' % close, r'\1', text)
486 text = _re.sub(r'%s *%s' % (open, close), r'', text)
487 text = _re.sub(r'\(([^|]*)\)', r'\1', text)
488 text = text.strip()
489
490 # return the text
491 return text
492
493 def _format_text(self, text):
494 if '%(prog)' in text:
495 text = text % dict(prog=self._prog)
Serhiy Storchakaf4511122014-01-09 23:14:27 +0200496 text_width = max(self._width - self._current_indent, 11)
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000497 indent = ' ' * self._current_indent
498 return self._fill_text(text, text_width, indent) + '\n\n'
499
500 def _format_action(self, action):
501 # determine the required width and the entry label
502 help_position = min(self._action_max_length + 2,
503 self._max_help_position)
Serhiy Storchakaf4511122014-01-09 23:14:27 +0200504 help_width = max(self._width - help_position, 11)
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000505 action_width = help_position - self._current_indent - 2
506 action_header = self._format_action_invocation(action)
507
Georg Brandl2514f522014-10-20 08:36:02 +0200508 # no help; start on same line and add a final newline
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000509 if not action.help:
510 tup = self._current_indent, '', action_header
511 action_header = '%*s%s\n' % tup
512
513 # short action name; start on the same line and pad two spaces
514 elif len(action_header) <= action_width:
515 tup = self._current_indent, '', action_width, action_header
516 action_header = '%*s%-*s ' % tup
517 indent_first = 0
518
519 # long action name; start on the next line
520 else:
521 tup = self._current_indent, '', action_header
522 action_header = '%*s%s\n' % tup
523 indent_first = help_position
524
525 # collect the pieces of the action help
526 parts = [action_header]
527
528 # if there was help for the action, add lines of help text
529 if action.help:
530 help_text = self._expand_help(action)
531 help_lines = self._split_lines(help_text, help_width)
532 parts.append('%*s%s\n' % (indent_first, '', help_lines[0]))
533 for line in help_lines[1:]:
534 parts.append('%*s%s\n' % (help_position, '', line))
535
536 # or add a newline if the description doesn't end with one
537 elif not action_header.endswith('\n'):
538 parts.append('\n')
539
540 # if there are any sub-actions, add their help as well
541 for subaction in self._iter_indented_subactions(action):
542 parts.append(self._format_action(subaction))
543
544 # return a single string
545 return self._join_parts(parts)
546
547 def _format_action_invocation(self, action):
548 if not action.option_strings:
Steven Bethard0331e902011-03-26 14:48:04 +0100549 default = self._get_default_metavar_for_positional(action)
550 metavar, = self._metavar_formatter(action, default)(1)
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000551 return metavar
552
553 else:
554 parts = []
555
556 # if the Optional doesn't take a value, format is:
557 # -s, --long
558 if action.nargs == 0:
559 parts.extend(action.option_strings)
560
561 # if the Optional takes a value, format is:
562 # -s ARGS, --long ARGS
563 else:
Steven Bethard0331e902011-03-26 14:48:04 +0100564 default = self._get_default_metavar_for_optional(action)
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000565 args_string = self._format_args(action, default)
566 for option_string in action.option_strings:
567 parts.append('%s %s' % (option_string, args_string))
568
569 return ', '.join(parts)
570
571 def _metavar_formatter(self, action, default_metavar):
572 if action.metavar is not None:
573 result = action.metavar
574 elif action.choices is not None:
575 choice_strs = [str(choice) for choice in action.choices]
576 result = '{%s}' % ','.join(choice_strs)
577 else:
578 result = default_metavar
579
580 def format(tuple_size):
581 if isinstance(result, tuple):
582 return result
583 else:
584 return (result, ) * tuple_size
585 return format
586
587 def _format_args(self, action, default_metavar):
588 get_metavar = self._metavar_formatter(action, default_metavar)
589 if action.nargs is None:
590 result = '%s' % get_metavar(1)
591 elif action.nargs == OPTIONAL:
592 result = '[%s]' % get_metavar(1)
593 elif action.nargs == ZERO_OR_MORE:
Brandt Buchera0ed99b2019-11-11 12:47:48 -0800594 metavar = get_metavar(1)
595 if len(metavar) == 2:
596 result = '[%s [%s ...]]' % metavar
597 else:
598 result = '[%s ...]' % metavar
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000599 elif action.nargs == ONE_OR_MORE:
600 result = '%s [%s ...]' % get_metavar(2)
601 elif action.nargs == REMAINDER:
602 result = '...'
603 elif action.nargs == PARSER:
604 result = '%s ...' % get_metavar(1)
R. David Murray0f6b9d22017-09-06 20:25:40 -0400605 elif action.nargs == SUPPRESS:
606 result = ''
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000607 else:
tmblweed4b3e9752019-08-01 21:57:13 -0700608 try:
609 formats = ['%s' for _ in range(action.nargs)]
610 except TypeError:
611 raise ValueError("invalid nargs value") from None
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000612 result = ' '.join(formats) % get_metavar(action.nargs)
613 return result
614
615 def _expand_help(self, action):
616 params = dict(vars(action), prog=self._prog)
617 for name in list(params):
618 if params[name] is SUPPRESS:
619 del params[name]
620 for name in list(params):
621 if hasattr(params[name], '__name__'):
622 params[name] = params[name].__name__
623 if params.get('choices') is not None:
624 choices_str = ', '.join([str(c) for c in params['choices']])
625 params['choices'] = choices_str
626 return self._get_help_string(action) % params
627
628 def _iter_indented_subactions(self, action):
629 try:
630 get_subactions = action._get_subactions
631 except AttributeError:
632 pass
633 else:
634 self._indent()
Philip Jenvey4993cc02012-10-01 12:53:43 -0700635 yield from get_subactions()
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000636 self._dedent()
637
638 def _split_lines(self, text, width):
639 text = self._whitespace_matcher.sub(' ', text).strip()
Serhiy Storchaka81108372017-09-26 00:55:55 +0300640 # The textwrap module is used only for formatting help.
641 # Delay its import for speeding up the common usage of argparse.
642 import textwrap
643 return textwrap.wrap(text, width)
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000644
645 def _fill_text(self, text, width, indent):
646 text = self._whitespace_matcher.sub(' ', text).strip()
Serhiy Storchaka81108372017-09-26 00:55:55 +0300647 import textwrap
648 return textwrap.fill(text, width,
649 initial_indent=indent,
650 subsequent_indent=indent)
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000651
652 def _get_help_string(self, action):
653 return action.help
654
Steven Bethard0331e902011-03-26 14:48:04 +0100655 def _get_default_metavar_for_optional(self, action):
656 return action.dest.upper()
657
658 def _get_default_metavar_for_positional(self, action):
659 return action.dest
660
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000661
662class RawDescriptionHelpFormatter(HelpFormatter):
663 """Help message formatter which retains any formatting in descriptions.
664
665 Only the name of this class is considered a public API. All the methods
666 provided by the class are considered an implementation detail.
667 """
668
669 def _fill_text(self, text, width, indent):
Ezio Melottid8b509b2011-09-28 17:37:55 +0300670 return ''.join(indent + line for line in text.splitlines(keepends=True))
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000671
672
673class RawTextHelpFormatter(RawDescriptionHelpFormatter):
674 """Help message formatter which retains formatting of all help text.
675
676 Only the name of this class is considered a public API. All the methods
677 provided by the class are considered an implementation detail.
678 """
679
680 def _split_lines(self, text, width):
681 return text.splitlines()
682
683
684class ArgumentDefaultsHelpFormatter(HelpFormatter):
685 """Help message formatter which adds default values to argument help.
686
687 Only the name of this class is considered a public API. All the methods
688 provided by the class are considered an implementation detail.
689 """
690
691 def _get_help_string(self, action):
692 help = action.help
693 if '%(default)' not in action.help:
694 if action.default is not SUPPRESS:
695 defaulting_nargs = [OPTIONAL, ZERO_OR_MORE]
696 if action.option_strings or action.nargs in defaulting_nargs:
697 help += ' (default: %(default)s)'
698 return help
699
700
Steven Bethard0331e902011-03-26 14:48:04 +0100701class MetavarTypeHelpFormatter(HelpFormatter):
702 """Help message formatter which uses the argument 'type' as the default
703 metavar value (instead of the argument 'dest')
704
705 Only the name of this class is considered a public API. All the methods
706 provided by the class are considered an implementation detail.
707 """
708
709 def _get_default_metavar_for_optional(self, action):
710 return action.type.__name__
711
712 def _get_default_metavar_for_positional(self, action):
713 return action.type.__name__
714
715
716
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000717# =====================
718# Options and Arguments
719# =====================
720
721def _get_action_name(argument):
722 if argument is None:
723 return None
724 elif argument.option_strings:
725 return '/'.join(argument.option_strings)
726 elif argument.metavar not in (None, SUPPRESS):
727 return argument.metavar
728 elif argument.dest not in (None, SUPPRESS):
729 return argument.dest
Miss Islington (bot)c5899922021-07-23 06:27:05 -0700730 elif argument.choices:
731 return '{' + ','.join(argument.choices) + '}'
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000732 else:
733 return None
734
735
736class ArgumentError(Exception):
737 """An error from creating or using an argument (optional or positional).
738
739 The string value of this exception is the message, augmented with
740 information about the argument that caused it.
741 """
742
743 def __init__(self, argument, message):
744 self.argument_name = _get_action_name(argument)
745 self.message = message
746
747 def __str__(self):
748 if self.argument_name is None:
749 format = '%(message)s'
750 else:
751 format = 'argument %(argument_name)s: %(message)s'
752 return format % dict(message=self.message,
753 argument_name=self.argument_name)
754
755
756class ArgumentTypeError(Exception):
757 """An error from trying to convert a command line string to a type."""
758 pass
759
760
761# ==============
762# Action classes
763# ==============
764
765class Action(_AttributeHolder):
766 """Information about how to convert command line strings to Python objects.
767
768 Action objects are used by an ArgumentParser to represent the information
769 needed to parse a single argument from one or more strings from the
770 command line. The keyword arguments to the Action constructor are also
771 all attributes of Action instances.
772
773 Keyword Arguments:
774
775 - option_strings -- A list of command-line option strings which
776 should be associated with this action.
777
778 - dest -- The name of the attribute to hold the created object(s)
779
780 - nargs -- The number of command-line arguments that should be
781 consumed. By default, one argument will be consumed and a single
782 value will be produced. Other values include:
783 - N (an integer) consumes N arguments (and produces a list)
784 - '?' consumes zero or one arguments
785 - '*' consumes zero or more arguments (and produces a list)
786 - '+' consumes one or more arguments (and produces a list)
787 Note that the difference between the default and nargs=1 is that
788 with the default, a single value will be produced, while with
789 nargs=1, a list containing a single value will be produced.
790
791 - const -- The value to be produced if the option is specified and the
792 option uses an action that takes no values.
793
794 - default -- The value to be produced if the option is not specified.
795
R David Murray15cd9a02012-07-21 17:04:25 -0400796 - type -- A callable that accepts a single string argument, and
797 returns the converted value. The standard Python types str, int,
798 float, and complex are useful examples of such callables. If None,
799 str is used.
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000800
801 - choices -- A container of values that should be allowed. If not None,
802 after a command-line argument has been converted to the appropriate
803 type, an exception will be raised if it is not a member of this
804 collection.
805
806 - required -- True if the action must always be specified at the
807 command line. This is only meaningful for optional command-line
808 arguments.
809
810 - help -- The help string describing the argument.
811
812 - metavar -- The name to be used for the option's argument with the
813 help string. If None, the 'dest' value will be used as the name.
814 """
815
816 def __init__(self,
817 option_strings,
818 dest,
819 nargs=None,
820 const=None,
821 default=None,
822 type=None,
823 choices=None,
824 required=False,
825 help=None,
826 metavar=None):
827 self.option_strings = option_strings
828 self.dest = dest
829 self.nargs = nargs
830 self.const = const
831 self.default = default
832 self.type = type
833 self.choices = choices
834 self.required = required
835 self.help = help
836 self.metavar = metavar
837
838 def _get_kwargs(self):
839 names = [
840 'option_strings',
841 'dest',
842 'nargs',
843 'const',
844 'default',
845 'type',
846 'choices',
847 'help',
848 'metavar',
849 ]
850 return [(name, getattr(self, name)) for name in names]
851
Rémi Lapeyre6a517c62019-09-13 12:17:43 +0200852 def format_usage(self):
853 return self.option_strings[0]
854
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000855 def __call__(self, parser, namespace, values, option_string=None):
856 raise NotImplementedError(_('.__call__() not defined'))
857
Rémi Lapeyre6a517c62019-09-13 12:17:43 +0200858class BooleanOptionalAction(Action):
859 def __init__(self,
860 option_strings,
861 dest,
Rémi Lapeyre6a517c62019-09-13 12:17:43 +0200862 default=None,
863 type=None,
864 choices=None,
865 required=False,
866 help=None,
867 metavar=None):
868
869 _option_strings = []
870 for option_string in option_strings:
871 _option_strings.append(option_string)
872
873 if option_string.startswith('--'):
874 option_string = '--no-' + option_string[2:]
875 _option_strings.append(option_string)
876
877 if help is not None and default is not None:
878 help += f" (default: {default})"
879
880 super().__init__(
881 option_strings=_option_strings,
882 dest=dest,
883 nargs=0,
884 default=default,
885 type=type,
886 choices=choices,
887 required=required,
888 help=help,
889 metavar=metavar)
890
891 def __call__(self, parser, namespace, values, option_string=None):
892 if option_string in self.option_strings:
893 setattr(namespace, self.dest, not option_string.startswith('--no-'))
894
895 def format_usage(self):
896 return ' | '.join(self.option_strings)
897
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000898
899class _StoreAction(Action):
900
901 def __init__(self,
902 option_strings,
903 dest,
904 nargs=None,
905 const=None,
906 default=None,
907 type=None,
908 choices=None,
909 required=False,
910 help=None,
911 metavar=None):
912 if nargs == 0:
tmblweed4b3e9752019-08-01 21:57:13 -0700913 raise ValueError('nargs for store actions must be != 0; if you '
Benjamin Peterson698a18a2010-03-02 22:34:37 +0000914 'have nothing to store, actions such as store '
915 'true or store const may be more appropriate')
916 if const is not None and nargs != OPTIONAL:
917 raise ValueError('nargs must be %r to supply const' % OPTIONAL)
918 super(_StoreAction, self).__init__(
919 option_strings=option_strings,
920 dest=dest,
921 nargs=nargs,
922 const=const,
923 default=default,
924 type=type,
925 choices=choices,
926 required=required,
927 help=help,
928 metavar=metavar)
929
930 def __call__(self, parser, namespace, values, option_string=None):
931 setattr(namespace, self.dest, values)
932
933
934class _StoreConstAction(Action):
935
936 def __init__(self,
937 option_strings,
938 dest,
939 const,
940 default=None,
941 required=False,
942 help=None,
943 metavar=None):
944 super(_StoreConstAction, self).__init__(
945 option_strings=option_strings,
946 dest=dest,
947 nargs=0,
948 const=const,
949 default=default,
950 required=required,
951 help=help)
952
953 def __call__(self, parser, namespace, values, option_string=None):
954 setattr(namespace, self.dest, self.const)
955
956
957class _StoreTrueAction(_StoreConstAction):
958
959 def __init__(self,
960 option_strings,
961 dest,
962 default=False,
963 required=False,
964 help=None):
965 super(_StoreTrueAction, self).__init__(
966 option_strings=option_strings,
967 dest=dest,
968 const=True,
969 default=default,
970 required=required,
971 help=help)
972
973
974class _StoreFalseAction(_StoreConstAction):
975
976 def __init__(self,
977 option_strings,
978 dest,
979 default=True,
980 required=False,
981 help=None):
982 super(_StoreFalseAction, self).__init__(
983 option_strings=option_strings,
984 dest=dest,
985 const=False,
986 default=default,
987 required=required,
988 help=help)
989
990
991class _AppendAction(Action):
992
993 def __init__(self,
994 option_strings,
995 dest,
996 nargs=None,
997 const=None,
998 default=None,
999 type=None,
1000 choices=None,
1001 required=False,
1002 help=None,
1003 metavar=None):
1004 if nargs == 0:
tmblweed4b3e9752019-08-01 21:57:13 -07001005 raise ValueError('nargs for append actions must be != 0; if arg '
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001006 'strings are not supplying the value to append, '
1007 'the append const action may be more appropriate')
1008 if const is not None and nargs != OPTIONAL:
1009 raise ValueError('nargs must be %r to supply const' % OPTIONAL)
1010 super(_AppendAction, self).__init__(
1011 option_strings=option_strings,
1012 dest=dest,
1013 nargs=nargs,
1014 const=const,
1015 default=default,
1016 type=type,
1017 choices=choices,
1018 required=required,
1019 help=help,
1020 metavar=metavar)
1021
1022 def __call__(self, parser, namespace, values, option_string=None):
Serhiy Storchaka81108372017-09-26 00:55:55 +03001023 items = getattr(namespace, self.dest, None)
1024 items = _copy_items(items)
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001025 items.append(values)
1026 setattr(namespace, self.dest, items)
1027
1028
1029class _AppendConstAction(Action):
1030
1031 def __init__(self,
1032 option_strings,
1033 dest,
1034 const,
1035 default=None,
1036 required=False,
1037 help=None,
1038 metavar=None):
1039 super(_AppendConstAction, self).__init__(
1040 option_strings=option_strings,
1041 dest=dest,
1042 nargs=0,
1043 const=const,
1044 default=default,
1045 required=required,
1046 help=help,
1047 metavar=metavar)
1048
1049 def __call__(self, parser, namespace, values, option_string=None):
Serhiy Storchaka81108372017-09-26 00:55:55 +03001050 items = getattr(namespace, self.dest, None)
1051 items = _copy_items(items)
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001052 items.append(self.const)
1053 setattr(namespace, self.dest, items)
1054
1055
1056class _CountAction(Action):
1057
1058 def __init__(self,
1059 option_strings,
1060 dest,
1061 default=None,
1062 required=False,
1063 help=None):
1064 super(_CountAction, self).__init__(
1065 option_strings=option_strings,
1066 dest=dest,
1067 nargs=0,
1068 default=default,
1069 required=required,
1070 help=help)
1071
1072 def __call__(self, parser, namespace, values, option_string=None):
Serhiy Storchaka81108372017-09-26 00:55:55 +03001073 count = getattr(namespace, self.dest, None)
1074 if count is None:
1075 count = 0
1076 setattr(namespace, self.dest, count + 1)
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001077
1078
1079class _HelpAction(Action):
1080
1081 def __init__(self,
1082 option_strings,
1083 dest=SUPPRESS,
1084 default=SUPPRESS,
1085 help=None):
1086 super(_HelpAction, self).__init__(
1087 option_strings=option_strings,
1088 dest=dest,
1089 default=default,
1090 nargs=0,
1091 help=help)
1092
1093 def __call__(self, parser, namespace, values, option_string=None):
1094 parser.print_help()
1095 parser.exit()
1096
1097
1098class _VersionAction(Action):
1099
1100 def __init__(self,
1101 option_strings,
1102 version=None,
1103 dest=SUPPRESS,
1104 default=SUPPRESS,
Steven Bethard50fe5932010-05-24 03:47:38 +00001105 help="show program's version number and exit"):
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001106 super(_VersionAction, self).__init__(
1107 option_strings=option_strings,
1108 dest=dest,
1109 default=default,
1110 nargs=0,
1111 help=help)
1112 self.version = version
1113
1114 def __call__(self, parser, namespace, values, option_string=None):
1115 version = self.version
1116 if version is None:
1117 version = parser.version
1118 formatter = parser._get_formatter()
1119 formatter.add_text(version)
Eli Benderskycdac5512013-09-06 06:49:15 -07001120 parser._print_message(formatter.format_help(), _sys.stdout)
1121 parser.exit()
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001122
1123
1124class _SubParsersAction(Action):
1125
1126 class _ChoicesPseudoAction(Action):
1127
Steven Bethardfd311a72010-12-18 11:19:23 +00001128 def __init__(self, name, aliases, help):
1129 metavar = dest = name
1130 if aliases:
1131 metavar += ' (%s)' % ', '.join(aliases)
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001132 sup = super(_SubParsersAction._ChoicesPseudoAction, self)
Steven Bethardfd311a72010-12-18 11:19:23 +00001133 sup.__init__(option_strings=[], dest=dest, help=help,
1134 metavar=metavar)
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001135
1136 def __init__(self,
1137 option_strings,
1138 prog,
1139 parser_class,
1140 dest=SUPPRESS,
Ned Deily8ebf5ce2018-05-23 21:55:15 -04001141 required=False,
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001142 help=None,
1143 metavar=None):
1144
1145 self._prog_prefix = prog
1146 self._parser_class = parser_class
Raymond Hettinger05565ed2018-01-11 22:20:33 -08001147 self._name_parser_map = {}
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001148 self._choices_actions = []
1149
1150 super(_SubParsersAction, self).__init__(
1151 option_strings=option_strings,
1152 dest=dest,
1153 nargs=PARSER,
1154 choices=self._name_parser_map,
Anthony Sottileaaf6fc02017-09-20 14:35:27 -07001155 required=required,
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001156 help=help,
1157 metavar=metavar)
1158
1159 def add_parser(self, name, **kwargs):
1160 # set prog from the existing prefix
1161 if kwargs.get('prog') is None:
1162 kwargs['prog'] = '%s %s' % (self._prog_prefix, name)
1163
Steven Bethardfd311a72010-12-18 11:19:23 +00001164 aliases = kwargs.pop('aliases', ())
1165
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001166 # create a pseudo-action to hold the choice help
1167 if 'help' in kwargs:
1168 help = kwargs.pop('help')
Steven Bethardfd311a72010-12-18 11:19:23 +00001169 choice_action = self._ChoicesPseudoAction(name, aliases, help)
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001170 self._choices_actions.append(choice_action)
1171
1172 # create the parser and add it to the map
1173 parser = self._parser_class(**kwargs)
1174 self._name_parser_map[name] = parser
Steven Bethardfd311a72010-12-18 11:19:23 +00001175
1176 # make parser available under aliases also
1177 for alias in aliases:
1178 self._name_parser_map[alias] = parser
1179
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001180 return parser
1181
1182 def _get_subactions(self):
1183 return self._choices_actions
1184
1185 def __call__(self, parser, namespace, values, option_string=None):
1186 parser_name = values[0]
1187 arg_strings = values[1:]
1188
1189 # set the parser name if requested
1190 if self.dest is not SUPPRESS:
1191 setattr(namespace, self.dest, parser_name)
1192
1193 # select the parser
1194 try:
1195 parser = self._name_parser_map[parser_name]
1196 except KeyError:
Éric Araujobb48a8b2010-12-03 19:41:00 +00001197 args = {'parser_name': parser_name,
1198 'choices': ', '.join(self._name_parser_map)}
1199 msg = _('unknown parser %(parser_name)r (choices: %(choices)s)') % args
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001200 raise ArgumentError(self, msg)
1201
1202 # parse all the remaining options into the namespace
Steven Bethardfca2e8a2010-11-02 12:47:22 +00001203 # store any unrecognized options on the object, so that the top
1204 # level parser can decide what to do with them
R David Murray7570cbd2014-10-17 19:55:11 -04001205
1206 # In case this subparser defines new defaults, we parse them
1207 # in a new namespace object and then update the original
1208 # namespace for the relevant parts.
1209 subnamespace, arg_strings = parser.parse_known_args(arg_strings, None)
1210 for key, value in vars(subnamespace).items():
1211 setattr(namespace, key, value)
1212
Steven Bethardfca2e8a2010-11-02 12:47:22 +00001213 if arg_strings:
1214 vars(namespace).setdefault(_UNRECOGNIZED_ARGS_ATTR, [])
1215 getattr(namespace, _UNRECOGNIZED_ARGS_ATTR).extend(arg_strings)
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001216
Batuhan Taşkayaaa32a7e2019-05-21 20:47:42 +03001217class _ExtendAction(_AppendAction):
1218 def __call__(self, parser, namespace, values, option_string=None):
1219 items = getattr(namespace, self.dest, None)
1220 items = _copy_items(items)
1221 items.extend(values)
1222 setattr(namespace, self.dest, items)
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001223
1224# ==============
1225# Type classes
1226# ==============
1227
1228class FileType(object):
1229 """Factory for creating file object types
1230
1231 Instances of FileType are typically passed as type= arguments to the
1232 ArgumentParser add_argument() method.
1233
1234 Keyword Arguments:
1235 - mode -- A string indicating how the file is to be opened. Accepts the
1236 same values as the builtin open() function.
1237 - bufsize -- The file's desired buffer size. Accepts the same values as
1238 the builtin open() function.
Petri Lehtinen74d6c252012-12-15 22:39:32 +02001239 - encoding -- The file's encoding. Accepts the same values as the
Terry Jan Reedy8e7586b2013-03-11 18:38:13 -04001240 builtin open() function.
Petri Lehtinen74d6c252012-12-15 22:39:32 +02001241 - errors -- A string indicating how encoding and decoding errors are to
1242 be handled. Accepts the same value as the builtin open() function.
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001243 """
1244
Petri Lehtinen74d6c252012-12-15 22:39:32 +02001245 def __init__(self, mode='r', bufsize=-1, encoding=None, errors=None):
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001246 self._mode = mode
1247 self._bufsize = bufsize
Petri Lehtinen74d6c252012-12-15 22:39:32 +02001248 self._encoding = encoding
1249 self._errors = errors
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001250
1251 def __call__(self, string):
1252 # the special argument "-" means sys.std{in,out}
1253 if string == '-':
1254 if 'r' in self._mode:
1255 return _sys.stdin
1256 elif 'w' in self._mode:
1257 return _sys.stdout
1258 else:
Éric Araujoa9c7a8f2010-12-03 19:19:17 +00001259 msg = _('argument "-" with mode %r') % self._mode
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001260 raise ValueError(msg)
1261
1262 # all other arguments are used as file names
Steven Bethardb0270112011-01-24 21:02:50 +00001263 try:
Petri Lehtinen74d6c252012-12-15 22:39:32 +02001264 return open(string, self._mode, self._bufsize, self._encoding,
1265 self._errors)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02001266 except OSError as e:
Jakub Kulík42671ae2019-09-13 11:25:32 +02001267 args = {'filename': string, 'error': e}
1268 message = _("can't open '%(filename)s': %(error)s")
1269 raise ArgumentTypeError(message % args)
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001270
1271 def __repr__(self):
Steven Bethardb0270112011-01-24 21:02:50 +00001272 args = self._mode, self._bufsize
Petri Lehtinen74d6c252012-12-15 22:39:32 +02001273 kwargs = [('encoding', self._encoding), ('errors', self._errors)]
1274 args_str = ', '.join([repr(arg) for arg in args if arg != -1] +
1275 ['%s=%r' % (kw, arg) for kw, arg in kwargs
1276 if arg is not None])
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001277 return '%s(%s)' % (type(self).__name__, args_str)
1278
1279# ===========================
1280# Optional and Positional Parsing
1281# ===========================
1282
1283class Namespace(_AttributeHolder):
1284 """Simple object for storing attributes.
1285
1286 Implements equality by attribute names and values, and provides a simple
1287 string representation.
1288 """
1289
1290 def __init__(self, **kwargs):
1291 for name in kwargs:
1292 setattr(self, name, kwargs[name])
1293
1294 def __eq__(self, other):
Raymond Hettingerdea46ec2014-05-26 00:43:27 -07001295 if not isinstance(other, Namespace):
1296 return NotImplemented
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001297 return vars(self) == vars(other)
1298
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001299 def __contains__(self, key):
1300 return key in self.__dict__
1301
1302
1303class _ActionsContainer(object):
1304
1305 def __init__(self,
1306 description,
1307 prefix_chars,
1308 argument_default,
1309 conflict_handler):
1310 super(_ActionsContainer, self).__init__()
1311
1312 self.description = description
1313 self.argument_default = argument_default
1314 self.prefix_chars = prefix_chars
1315 self.conflict_handler = conflict_handler
1316
1317 # set up registries
1318 self._registries = {}
1319
1320 # register actions
1321 self.register('action', None, _StoreAction)
1322 self.register('action', 'store', _StoreAction)
1323 self.register('action', 'store_const', _StoreConstAction)
1324 self.register('action', 'store_true', _StoreTrueAction)
1325 self.register('action', 'store_false', _StoreFalseAction)
1326 self.register('action', 'append', _AppendAction)
1327 self.register('action', 'append_const', _AppendConstAction)
1328 self.register('action', 'count', _CountAction)
1329 self.register('action', 'help', _HelpAction)
1330 self.register('action', 'version', _VersionAction)
1331 self.register('action', 'parsers', _SubParsersAction)
Batuhan Taşkayaaa32a7e2019-05-21 20:47:42 +03001332 self.register('action', 'extend', _ExtendAction)
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001333
1334 # raise an exception if the conflict handler is invalid
1335 self._get_handler()
1336
1337 # action storage
1338 self._actions = []
1339 self._option_string_actions = {}
1340
1341 # groups
1342 self._action_groups = []
1343 self._mutually_exclusive_groups = []
1344
1345 # defaults storage
1346 self._defaults = {}
1347
1348 # determines whether an "option" looks like a negative number
1349 self._negative_number_matcher = _re.compile(r'^-\d+$|^-\d*\.\d+$')
1350
1351 # whether or not there are any optionals that look like negative
1352 # numbers -- uses a list so it can be shared and edited
1353 self._has_negative_number_optionals = []
1354
1355 # ====================
1356 # Registration methods
1357 # ====================
1358 def register(self, registry_name, value, object):
1359 registry = self._registries.setdefault(registry_name, {})
1360 registry[value] = object
1361
1362 def _registry_get(self, registry_name, value, default=None):
1363 return self._registries[registry_name].get(value, default)
1364
1365 # ==================================
1366 # Namespace default accessor methods
1367 # ==================================
1368 def set_defaults(self, **kwargs):
1369 self._defaults.update(kwargs)
1370
1371 # if these defaults match any existing arguments, replace
1372 # the previous default on the object with the new one
1373 for action in self._actions:
1374 if action.dest in kwargs:
1375 action.default = kwargs[action.dest]
1376
1377 def get_default(self, dest):
1378 for action in self._actions:
1379 if action.dest == dest and action.default is not None:
1380 return action.default
1381 return self._defaults.get(dest, None)
1382
1383
1384 # =======================
1385 # Adding argument actions
1386 # =======================
1387 def add_argument(self, *args, **kwargs):
1388 """
1389 add_argument(dest, ..., name=value, ...)
1390 add_argument(option_string, option_string, ..., name=value, ...)
1391 """
1392
1393 # if no positional args are supplied or only one is supplied and
1394 # it doesn't look like an option string, parse a positional
1395 # argument
1396 chars = self.prefix_chars
1397 if not args or len(args) == 1 and args[0][0] not in chars:
1398 if args and 'dest' in kwargs:
1399 raise ValueError('dest supplied twice for positional argument')
1400 kwargs = self._get_positional_kwargs(*args, **kwargs)
1401
1402 # otherwise, we're adding an optional argument
1403 else:
1404 kwargs = self._get_optional_kwargs(*args, **kwargs)
1405
1406 # if no default was supplied, use the parser-level default
1407 if 'default' not in kwargs:
1408 dest = kwargs['dest']
1409 if dest in self._defaults:
1410 kwargs['default'] = self._defaults[dest]
1411 elif self.argument_default is not None:
1412 kwargs['default'] = self.argument_default
1413
1414 # create the action object, and add it to the parser
1415 action_class = self._pop_action_class(kwargs)
Florent Xicluna5d1155c2011-10-28 14:45:05 +02001416 if not callable(action_class):
Steven Bethard7cb20a82011-04-04 01:53:02 +02001417 raise ValueError('unknown action "%s"' % (action_class,))
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001418 action = action_class(**kwargs)
1419
1420 # raise an error if the action type is not callable
1421 type_func = self._registry_get('type', action.type, action.type)
Florent Xicluna5d1155c2011-10-28 14:45:05 +02001422 if not callable(type_func):
Steven Bethard7cb20a82011-04-04 01:53:02 +02001423 raise ValueError('%r is not callable' % (type_func,))
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001424
zygocephalus03d58312019-06-07 23:08:36 +03001425 if type_func is FileType:
1426 raise ValueError('%r is a FileType class object, instance of it'
1427 ' must be passed' % (type_func,))
1428
Steven Bethard8d9a4622011-03-26 17:33:56 +01001429 # raise an error if the metavar does not match the type
1430 if hasattr(self, "_get_formatter"):
1431 try:
1432 self._get_formatter()._format_args(action, None)
1433 except TypeError:
1434 raise ValueError("length of metavar tuple does not match nargs")
1435
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001436 return self._add_action(action)
1437
1438 def add_argument_group(self, *args, **kwargs):
1439 group = _ArgumentGroup(self, *args, **kwargs)
1440 self._action_groups.append(group)
1441 return group
1442
1443 def add_mutually_exclusive_group(self, **kwargs):
1444 group = _MutuallyExclusiveGroup(self, **kwargs)
1445 self._mutually_exclusive_groups.append(group)
1446 return group
1447
1448 def _add_action(self, action):
1449 # resolve any conflicts
1450 self._check_conflict(action)
1451
1452 # add to actions list
1453 self._actions.append(action)
1454 action.container = self
1455
1456 # index the action by any option strings it has
1457 for option_string in action.option_strings:
1458 self._option_string_actions[option_string] = action
1459
1460 # set the flag if any option strings look like negative numbers
1461 for option_string in action.option_strings:
1462 if self._negative_number_matcher.match(option_string):
1463 if not self._has_negative_number_optionals:
1464 self._has_negative_number_optionals.append(True)
1465
1466 # return the created action
1467 return action
1468
1469 def _remove_action(self, action):
1470 self._actions.remove(action)
1471
1472 def _add_container_actions(self, container):
1473 # collect groups by titles
1474 title_group_map = {}
1475 for group in self._action_groups:
1476 if group.title in title_group_map:
1477 msg = _('cannot merge actions - two groups are named %r')
1478 raise ValueError(msg % (group.title))
1479 title_group_map[group.title] = group
1480
1481 # map each action to its group
1482 group_map = {}
1483 for group in container._action_groups:
1484
1485 # if a group with the title exists, use that, otherwise
1486 # create a new group matching the container's group
1487 if group.title not in title_group_map:
1488 title_group_map[group.title] = self.add_argument_group(
1489 title=group.title,
1490 description=group.description,
1491 conflict_handler=group.conflict_handler)
1492
1493 # map the actions to their new group
1494 for action in group._group_actions:
1495 group_map[action] = title_group_map[group.title]
1496
1497 # add container's mutually exclusive groups
1498 # NOTE: if add_mutually_exclusive_group ever gains title= and
1499 # description= then this code will need to be expanded as above
1500 for group in container._mutually_exclusive_groups:
1501 mutex_group = self.add_mutually_exclusive_group(
1502 required=group.required)
1503
1504 # map the actions to their new mutex group
1505 for action in group._group_actions:
1506 group_map[action] = mutex_group
1507
1508 # add all actions to this container or their group
1509 for action in container._actions:
1510 group_map.get(action, self)._add_action(action)
1511
1512 def _get_positional_kwargs(self, dest, **kwargs):
1513 # make sure required is not specified
1514 if 'required' in kwargs:
1515 msg = _("'required' is an invalid argument for positionals")
1516 raise TypeError(msg)
1517
1518 # mark positional arguments as required if at least one is
1519 # always required
1520 if kwargs.get('nargs') not in [OPTIONAL, ZERO_OR_MORE]:
1521 kwargs['required'] = True
1522 if kwargs.get('nargs') == ZERO_OR_MORE and 'default' not in kwargs:
1523 kwargs['required'] = True
1524
1525 # return the keyword arguments with no option strings
1526 return dict(kwargs, dest=dest, option_strings=[])
1527
1528 def _get_optional_kwargs(self, *args, **kwargs):
1529 # determine short and long option strings
1530 option_strings = []
1531 long_option_strings = []
1532 for option_string in args:
1533 # error on strings that don't start with an appropriate prefix
1534 if not option_string[0] in self.prefix_chars:
Éric Araujobb48a8b2010-12-03 19:41:00 +00001535 args = {'option': option_string,
1536 'prefix_chars': self.prefix_chars}
1537 msg = _('invalid option string %(option)r: '
1538 'must start with a character %(prefix_chars)r')
1539 raise ValueError(msg % args)
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001540
1541 # strings starting with two prefix characters are long options
1542 option_strings.append(option_string)
Shashank Parekhb9600b02019-06-21 08:32:22 +05301543 if len(option_string) > 1 and option_string[1] in self.prefix_chars:
1544 long_option_strings.append(option_string)
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001545
1546 # infer destination, '--foo-bar' -> 'foo_bar' and '-x' -> 'x'
1547 dest = kwargs.pop('dest', None)
1548 if dest is None:
1549 if long_option_strings:
1550 dest_option_string = long_option_strings[0]
1551 else:
1552 dest_option_string = option_strings[0]
1553 dest = dest_option_string.lstrip(self.prefix_chars)
1554 if not dest:
1555 msg = _('dest= is required for options like %r')
1556 raise ValueError(msg % option_string)
1557 dest = dest.replace('-', '_')
1558
1559 # return the updated keyword arguments
1560 return dict(kwargs, dest=dest, option_strings=option_strings)
1561
1562 def _pop_action_class(self, kwargs, default=None):
1563 action = kwargs.pop('action', default)
1564 return self._registry_get('action', action, action)
1565
1566 def _get_handler(self):
1567 # determine function from conflict handler string
1568 handler_func_name = '_handle_conflict_%s' % self.conflict_handler
1569 try:
1570 return getattr(self, handler_func_name)
1571 except AttributeError:
1572 msg = _('invalid conflict_resolution value: %r')
1573 raise ValueError(msg % self.conflict_handler)
1574
1575 def _check_conflict(self, action):
1576
1577 # find all options that conflict with this option
1578 confl_optionals = []
1579 for option_string in action.option_strings:
1580 if option_string in self._option_string_actions:
1581 confl_optional = self._option_string_actions[option_string]
1582 confl_optionals.append((option_string, confl_optional))
1583
1584 # resolve any conflicts
1585 if confl_optionals:
1586 conflict_handler = self._get_handler()
1587 conflict_handler(action, confl_optionals)
1588
1589 def _handle_conflict_error(self, action, conflicting_actions):
Éric Araujo12159152010-12-04 17:31:49 +00001590 message = ngettext('conflicting option string: %s',
1591 'conflicting option strings: %s',
1592 len(conflicting_actions))
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001593 conflict_string = ', '.join([option_string
1594 for option_string, action
1595 in conflicting_actions])
1596 raise ArgumentError(action, message % conflict_string)
1597
1598 def _handle_conflict_resolve(self, action, conflicting_actions):
1599
1600 # remove all conflicting options
1601 for option_string, action in conflicting_actions:
1602
1603 # remove the conflicting option
1604 action.option_strings.remove(option_string)
1605 self._option_string_actions.pop(option_string, None)
1606
1607 # if the option now has no option string, remove it from the
1608 # container holding it
1609 if not action.option_strings:
1610 action.container._remove_action(action)
1611
1612
1613class _ArgumentGroup(_ActionsContainer):
1614
1615 def __init__(self, container, title=None, description=None, **kwargs):
1616 # add any missing keyword arguments by checking the container
1617 update = kwargs.setdefault
1618 update('conflict_handler', container.conflict_handler)
1619 update('prefix_chars', container.prefix_chars)
1620 update('argument_default', container.argument_default)
1621 super_init = super(_ArgumentGroup, self).__init__
1622 super_init(description=description, **kwargs)
1623
1624 # group attributes
1625 self.title = title
1626 self._group_actions = []
1627
1628 # share most attributes with the container
1629 self._registries = container._registries
1630 self._actions = container._actions
1631 self._option_string_actions = container._option_string_actions
1632 self._defaults = container._defaults
1633 self._has_negative_number_optionals = \
1634 container._has_negative_number_optionals
Georg Brandl0f6b47a2011-01-30 12:19:35 +00001635 self._mutually_exclusive_groups = container._mutually_exclusive_groups
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001636
1637 def _add_action(self, action):
1638 action = super(_ArgumentGroup, self)._add_action(action)
1639 self._group_actions.append(action)
1640 return action
1641
1642 def _remove_action(self, action):
1643 super(_ArgumentGroup, self)._remove_action(action)
1644 self._group_actions.remove(action)
1645
1646
1647class _MutuallyExclusiveGroup(_ArgumentGroup):
1648
1649 def __init__(self, container, required=False):
1650 super(_MutuallyExclusiveGroup, self).__init__(container)
1651 self.required = required
1652 self._container = container
1653
1654 def _add_action(self, action):
1655 if action.required:
1656 msg = _('mutually exclusive arguments must be optional')
1657 raise ValueError(msg)
1658 action = self._container._add_action(action)
1659 self._group_actions.append(action)
1660 return action
1661
1662 def _remove_action(self, action):
1663 self._container._remove_action(action)
1664 self._group_actions.remove(action)
1665
1666
1667class ArgumentParser(_AttributeHolder, _ActionsContainer):
1668 """Object for parsing command line strings into Python objects.
1669
1670 Keyword Arguments:
1671 - prog -- The name of the program (default: sys.argv[0])
1672 - usage -- A usage message (default: auto-generated from arguments)
1673 - description -- A description of what the program does
1674 - epilog -- Text following the argument descriptions
1675 - parents -- Parsers whose arguments should be copied into this one
1676 - formatter_class -- HelpFormatter class for printing help messages
1677 - prefix_chars -- Characters that prefix optional arguments
1678 - fromfile_prefix_chars -- Characters that prefix files containing
1679 additional arguments
1680 - argument_default -- The default value for all arguments
1681 - conflict_handler -- String indicating how to handle conflicts
1682 - add_help -- Add a -h/-help option
Berker Peksag8089cd62015-02-14 01:39:17 +02001683 - allow_abbrev -- Allow long options to be abbreviated unambiguously
Hai Shif5456382019-09-12 05:56:05 -05001684 - exit_on_error -- Determines whether or not ArgumentParser exits with
1685 error info when an error occurs
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001686 """
1687
1688 def __init__(self,
1689 prog=None,
1690 usage=None,
1691 description=None,
1692 epilog=None,
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001693 parents=[],
1694 formatter_class=HelpFormatter,
1695 prefix_chars='-',
1696 fromfile_prefix_chars=None,
1697 argument_default=None,
1698 conflict_handler='error',
Berker Peksag8089cd62015-02-14 01:39:17 +02001699 add_help=True,
Hai Shif5456382019-09-12 05:56:05 -05001700 allow_abbrev=True,
1701 exit_on_error=True):
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001702
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001703 superinit = super(ArgumentParser, self).__init__
1704 superinit(description=description,
1705 prefix_chars=prefix_chars,
1706 argument_default=argument_default,
1707 conflict_handler=conflict_handler)
1708
1709 # default setting for prog
1710 if prog is None:
1711 prog = _os.path.basename(_sys.argv[0])
1712
1713 self.prog = prog
1714 self.usage = usage
1715 self.epilog = epilog
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001716 self.formatter_class = formatter_class
1717 self.fromfile_prefix_chars = fromfile_prefix_chars
1718 self.add_help = add_help
Berker Peksag8089cd62015-02-14 01:39:17 +02001719 self.allow_abbrev = allow_abbrev
Hai Shif5456382019-09-12 05:56:05 -05001720 self.exit_on_error = exit_on_error
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001721
1722 add_group = self.add_argument_group
1723 self._positionals = add_group(_('positional arguments'))
Raymond Hettinger41b223d2020-12-23 09:40:56 -08001724 self._optionals = add_group(_('options'))
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001725 self._subparsers = None
1726
1727 # register types
1728 def identity(string):
1729 return string
1730 self.register('type', None, identity)
1731
Florent Xiclunaaf1adbe2012-07-07 17:02:22 +02001732 # add help argument if necessary
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001733 # (using explicit default to override global argument_default)
R. David Murray88c49fe2010-08-03 17:56:09 +00001734 default_prefix = '-' if '-' in prefix_chars else prefix_chars[0]
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001735 if self.add_help:
1736 self.add_argument(
R. David Murray88c49fe2010-08-03 17:56:09 +00001737 default_prefix+'h', default_prefix*2+'help',
1738 action='help', default=SUPPRESS,
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001739 help=_('show this help message and exit'))
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001740
1741 # add parent arguments and defaults
1742 for parent in parents:
1743 self._add_container_actions(parent)
1744 try:
1745 defaults = parent._defaults
1746 except AttributeError:
1747 pass
1748 else:
1749 self._defaults.update(defaults)
1750
1751 # =======================
1752 # Pretty __repr__ methods
1753 # =======================
1754 def _get_kwargs(self):
1755 names = [
1756 'prog',
1757 'usage',
1758 'description',
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001759 'formatter_class',
1760 'conflict_handler',
1761 'add_help',
1762 ]
1763 return [(name, getattr(self, name)) for name in names]
1764
1765 # ==================================
1766 # Optional/Positional adding methods
1767 # ==================================
1768 def add_subparsers(self, **kwargs):
1769 if self._subparsers is not None:
1770 self.error(_('cannot have multiple subparser arguments'))
1771
1772 # add the parser class to the arguments if it's not present
1773 kwargs.setdefault('parser_class', type(self))
1774
1775 if 'title' in kwargs or 'description' in kwargs:
1776 title = _(kwargs.pop('title', 'subcommands'))
1777 description = _(kwargs.pop('description', None))
1778 self._subparsers = self.add_argument_group(title, description)
1779 else:
1780 self._subparsers = self._positionals
1781
1782 # prog defaults to the usage message of this parser, skipping
1783 # optional arguments and with no "usage:" prefix
1784 if kwargs.get('prog') is None:
1785 formatter = self._get_formatter()
1786 positionals = self._get_positional_actions()
1787 groups = self._mutually_exclusive_groups
1788 formatter.add_usage(self.usage, positionals, groups, '')
1789 kwargs['prog'] = formatter.format_help().strip()
1790
1791 # create the parsers action and add it to the positionals list
1792 parsers_class = self._pop_action_class(kwargs, 'parsers')
1793 action = parsers_class(option_strings=[], **kwargs)
1794 self._subparsers._add_action(action)
1795
1796 # return the created parsers action
1797 return action
1798
1799 def _add_action(self, action):
1800 if action.option_strings:
1801 self._optionals._add_action(action)
1802 else:
1803 self._positionals._add_action(action)
1804 return action
1805
1806 def _get_optional_actions(self):
1807 return [action
1808 for action in self._actions
1809 if action.option_strings]
1810
1811 def _get_positional_actions(self):
1812 return [action
1813 for action in self._actions
1814 if not action.option_strings]
1815
1816 # =====================================
1817 # Command line argument parsing methods
1818 # =====================================
1819 def parse_args(self, args=None, namespace=None):
1820 args, argv = self.parse_known_args(args, namespace)
1821 if argv:
1822 msg = _('unrecognized arguments: %s')
1823 self.error(msg % ' '.join(argv))
1824 return args
1825
1826 def parse_known_args(self, args=None, namespace=None):
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001827 if args is None:
R David Murrayb5228282012-09-08 12:08:01 -04001828 # args default to the system args
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001829 args = _sys.argv[1:]
R David Murrayb5228282012-09-08 12:08:01 -04001830 else:
1831 # make sure that args are mutable
1832 args = list(args)
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001833
1834 # default Namespace built from parser defaults
1835 if namespace is None:
1836 namespace = Namespace()
1837
1838 # add any action defaults that aren't present
1839 for action in self._actions:
1840 if action.dest is not SUPPRESS:
1841 if not hasattr(namespace, action.dest):
1842 if action.default is not SUPPRESS:
R David Murray6fb8fb12012-08-31 22:45:20 -04001843 setattr(namespace, action.dest, action.default)
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001844
1845 # add any parser defaults that aren't present
1846 for dest in self._defaults:
1847 if not hasattr(namespace, dest):
1848 setattr(namespace, dest, self._defaults[dest])
1849
1850 # parse the arguments and exit if there are any errors
Hai Shif5456382019-09-12 05:56:05 -05001851 if self.exit_on_error:
1852 try:
1853 namespace, args = self._parse_known_args(args, namespace)
1854 except ArgumentError:
1855 err = _sys.exc_info()[1]
1856 self.error(str(err))
1857 else:
Steven Bethardfca2e8a2010-11-02 12:47:22 +00001858 namespace, args = self._parse_known_args(args, namespace)
Hai Shif5456382019-09-12 05:56:05 -05001859
1860 if hasattr(namespace, _UNRECOGNIZED_ARGS_ATTR):
1861 args.extend(getattr(namespace, _UNRECOGNIZED_ARGS_ATTR))
1862 delattr(namespace, _UNRECOGNIZED_ARGS_ATTR)
1863 return namespace, args
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001864
1865 def _parse_known_args(self, arg_strings, namespace):
1866 # replace arg strings that are file references
1867 if self.fromfile_prefix_chars is not None:
1868 arg_strings = self._read_args_from_files(arg_strings)
1869
1870 # map all mutually exclusive arguments to the other arguments
1871 # they can't occur with
1872 action_conflicts = {}
1873 for mutex_group in self._mutually_exclusive_groups:
1874 group_actions = mutex_group._group_actions
1875 for i, mutex_action in enumerate(mutex_group._group_actions):
1876 conflicts = action_conflicts.setdefault(mutex_action, [])
1877 conflicts.extend(group_actions[:i])
1878 conflicts.extend(group_actions[i + 1:])
1879
1880 # find all option indices, and determine the arg_string_pattern
1881 # which has an 'O' if there is an option at an index,
1882 # an 'A' if there is an argument, or a '-' if there is a '--'
1883 option_string_indices = {}
1884 arg_string_pattern_parts = []
1885 arg_strings_iter = iter(arg_strings)
1886 for i, arg_string in enumerate(arg_strings_iter):
1887
1888 # all args after -- are non-options
1889 if arg_string == '--':
1890 arg_string_pattern_parts.append('-')
1891 for arg_string in arg_strings_iter:
1892 arg_string_pattern_parts.append('A')
1893
1894 # otherwise, add the arg to the arg strings
1895 # and note the index if it was an option
1896 else:
1897 option_tuple = self._parse_optional(arg_string)
1898 if option_tuple is None:
1899 pattern = 'A'
1900 else:
1901 option_string_indices[i] = option_tuple
1902 pattern = 'O'
1903 arg_string_pattern_parts.append(pattern)
1904
1905 # join the pieces together to form the pattern
1906 arg_strings_pattern = ''.join(arg_string_pattern_parts)
1907
1908 # converts arg strings to the appropriate and then takes the action
Benjamin Peterson16f2fd02010-03-02 23:09:38 +00001909 seen_actions = set()
1910 seen_non_default_actions = set()
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001911
1912 def take_action(action, argument_strings, option_string=None):
1913 seen_actions.add(action)
1914 argument_values = self._get_values(action, argument_strings)
1915
1916 # error if this argument is not allowed with other previously
1917 # seen arguments, assuming that actions that use the default
1918 # value don't really count as "present"
1919 if argument_values is not action.default:
1920 seen_non_default_actions.add(action)
1921 for conflict_action in action_conflicts.get(action, []):
1922 if conflict_action in seen_non_default_actions:
1923 msg = _('not allowed with argument %s')
1924 action_name = _get_action_name(conflict_action)
1925 raise ArgumentError(action, msg % action_name)
1926
1927 # take the action if we didn't receive a SUPPRESS value
1928 # (e.g. from a default)
1929 if argument_values is not SUPPRESS:
1930 action(self, namespace, argument_values, option_string)
1931
1932 # function to convert arg_strings into an optional action
1933 def consume_optional(start_index):
1934
1935 # get the optional identified at this index
1936 option_tuple = option_string_indices[start_index]
1937 action, option_string, explicit_arg = option_tuple
1938
1939 # identify additional optionals in the same arg string
1940 # (e.g. -xyz is the same as -x -y -z if no args are required)
1941 match_argument = self._match_argument
1942 action_tuples = []
1943 while True:
1944
1945 # if we found no optional action, skip it
1946 if action is None:
1947 extras.append(arg_strings[start_index])
1948 return start_index + 1
1949
1950 # if there is an explicit argument, try to match the
1951 # optional's string arguments to only this
1952 if explicit_arg is not None:
1953 arg_count = match_argument(action, 'A')
1954
1955 # if the action is a single-dash option and takes no
1956 # arguments, try to parse more single-dash options out
1957 # of the tail of the option string
1958 chars = self.prefix_chars
1959 if arg_count == 0 and option_string[1] not in chars:
1960 action_tuples.append((action, [], option_string))
Steven Bethard1ca45a52010-11-01 15:57:36 +00001961 char = option_string[0]
1962 option_string = char + explicit_arg[0]
1963 new_explicit_arg = explicit_arg[1:] or None
1964 optionals_map = self._option_string_actions
1965 if option_string in optionals_map:
1966 action = optionals_map[option_string]
1967 explicit_arg = new_explicit_arg
Benjamin Peterson698a18a2010-03-02 22:34:37 +00001968 else:
1969 msg = _('ignored explicit argument %r')
1970 raise ArgumentError(action, msg % explicit_arg)
1971
1972 # if the action expect exactly one argument, we've
1973 # successfully matched the option; exit the loop
1974 elif arg_count == 1:
1975 stop = start_index + 1
1976 args = [explicit_arg]
1977 action_tuples.append((action, args, option_string))
1978 break
1979
1980 # error if a double-dash option did not use the
1981 # explicit argument
1982 else:
1983 msg = _('ignored explicit argument %r')
1984 raise ArgumentError(action, msg % explicit_arg)
1985
1986 # if there is no explicit argument, try to match the
1987 # optional's string arguments with the following strings
1988 # if successful, exit the loop
1989 else:
1990 start = start_index + 1
1991 selected_patterns = arg_strings_pattern[start:]
1992 arg_count = match_argument(action, selected_patterns)
1993 stop = start + arg_count
1994 args = arg_strings[start:stop]
1995 action_tuples.append((action, args, option_string))
1996 break
1997
1998 # add the Optional to the list and return the index at which
1999 # the Optional's string args stopped
2000 assert action_tuples
2001 for action, args, option_string in action_tuples:
2002 take_action(action, args, option_string)
2003 return stop
2004
2005 # the list of Positionals left to be parsed; this is modified
2006 # by consume_positionals()
2007 positionals = self._get_positional_actions()
2008
2009 # function to convert arg_strings into positional actions
2010 def consume_positionals(start_index):
2011 # match as many Positionals as possible
2012 match_partial = self._match_arguments_partial
2013 selected_pattern = arg_strings_pattern[start_index:]
2014 arg_counts = match_partial(positionals, selected_pattern)
2015
2016 # slice off the appropriate arg strings for each Positional
2017 # and add the Positional and its args to the list
2018 for action, arg_count in zip(positionals, arg_counts):
2019 args = arg_strings[start_index: start_index + arg_count]
2020 start_index += arg_count
2021 take_action(action, args)
2022
2023 # slice off the Positionals that we just parsed and return the
2024 # index at which the Positionals' string args stopped
2025 positionals[:] = positionals[len(arg_counts):]
2026 return start_index
2027
2028 # consume Positionals and Optionals alternately, until we have
2029 # passed the last option string
2030 extras = []
2031 start_index = 0
2032 if option_string_indices:
2033 max_option_string_index = max(option_string_indices)
2034 else:
2035 max_option_string_index = -1
2036 while start_index <= max_option_string_index:
2037
2038 # consume any Positionals preceding the next option
2039 next_option_string_index = min([
2040 index
2041 for index in option_string_indices
2042 if index >= start_index])
2043 if start_index != next_option_string_index:
2044 positionals_end_index = consume_positionals(start_index)
2045
2046 # only try to parse the next optional if we didn't consume
2047 # the option string during the positionals parsing
2048 if positionals_end_index > start_index:
2049 start_index = positionals_end_index
2050 continue
2051 else:
2052 start_index = positionals_end_index
2053
2054 # if we consumed all the positionals we could and we're not
2055 # at the index of an option string, there were extra arguments
2056 if start_index not in option_string_indices:
2057 strings = arg_strings[start_index:next_option_string_index]
2058 extras.extend(strings)
2059 start_index = next_option_string_index
2060
2061 # consume the next optional and any arguments for it
2062 start_index = consume_optional(start_index)
2063
2064 # consume any positionals following the last Optional
2065 stop_index = consume_positionals(start_index)
2066
2067 # if we didn't consume all the argument strings, there were extras
2068 extras.extend(arg_strings[stop_index:])
2069
R David Murray64b0ef12012-08-31 23:09:34 -04002070 # make sure all required actions were present and also convert
2071 # action defaults which were not given as arguments
2072 required_actions = []
Benjamin Peterson698a18a2010-03-02 22:34:37 +00002073 for action in self._actions:
R David Murray6fb8fb12012-08-31 22:45:20 -04002074 if action not in seen_actions:
2075 if action.required:
R David Murray64b0ef12012-08-31 23:09:34 -04002076 required_actions.append(_get_action_name(action))
R David Murray6fb8fb12012-08-31 22:45:20 -04002077 else:
2078 # Convert action default now instead of doing it before
2079 # parsing arguments to avoid calling convert functions
2080 # twice (which may fail) if the argument was given, but
2081 # only if it was defined already in the namespace
2082 if (action.default is not None and
Barry Warsawd89774e2012-09-12 15:31:38 -04002083 isinstance(action.default, str) and
R David Murray64b0ef12012-08-31 23:09:34 -04002084 hasattr(namespace, action.dest) and
2085 action.default is getattr(namespace, action.dest)):
R David Murray6fb8fb12012-08-31 22:45:20 -04002086 setattr(namespace, action.dest,
2087 self._get_value(action, action.default))
Benjamin Peterson698a18a2010-03-02 22:34:37 +00002088
R David Murrayf97c59a2011-06-09 12:34:07 -04002089 if required_actions:
2090 self.error(_('the following arguments are required: %s') %
2091 ', '.join(required_actions))
Benjamin Peterson698a18a2010-03-02 22:34:37 +00002092
2093 # make sure all required groups had one option present
2094 for group in self._mutually_exclusive_groups:
2095 if group.required:
2096 for action in group._group_actions:
2097 if action in seen_non_default_actions:
2098 break
2099
2100 # if no actions were used, report the error
2101 else:
2102 names = [_get_action_name(action)
2103 for action in group._group_actions
2104 if action.help is not SUPPRESS]
2105 msg = _('one of the arguments %s is required')
2106 self.error(msg % ' '.join(names))
2107
2108 # return the updated namespace and the extra arguments
2109 return namespace, extras
2110
2111 def _read_args_from_files(self, arg_strings):
2112 # expand arguments referencing files
2113 new_arg_strings = []
2114 for arg_string in arg_strings:
2115
2116 # for regular arguments, just add them back into the list
R David Murrayb94082a2012-07-21 22:20:11 -04002117 if not arg_string or arg_string[0] not in self.fromfile_prefix_chars:
Benjamin Peterson698a18a2010-03-02 22:34:37 +00002118 new_arg_strings.append(arg_string)
2119
2120 # replace arguments referencing files with the file content
2121 else:
2122 try:
Giampaolo Rodola'2f50aaf2013-02-12 02:04:27 +01002123 with open(arg_string[1:]) as args_file:
Benjamin Peterson698a18a2010-03-02 22:34:37 +00002124 arg_strings = []
2125 for arg_line in args_file.read().splitlines():
2126 for arg in self.convert_arg_line_to_args(arg_line):
2127 arg_strings.append(arg)
2128 arg_strings = self._read_args_from_files(arg_strings)
2129 new_arg_strings.extend(arg_strings)
Andrew Svetlovf7a17b42012-12-25 16:47:37 +02002130 except OSError:
Benjamin Peterson698a18a2010-03-02 22:34:37 +00002131 err = _sys.exc_info()[1]
2132 self.error(str(err))
2133
2134 # return the modified argument list
2135 return new_arg_strings
2136
2137 def convert_arg_line_to_args(self, arg_line):
2138 return [arg_line]
2139
2140 def _match_argument(self, action, arg_strings_pattern):
2141 # match the pattern for this action to the arg strings
2142 nargs_pattern = self._get_nargs_pattern(action)
2143 match = _re.match(nargs_pattern, arg_strings_pattern)
2144
2145 # raise an exception if we weren't able to find a match
2146 if match is None:
2147 nargs_errors = {
2148 None: _('expected one argument'),
2149 OPTIONAL: _('expected at most one argument'),
2150 ONE_OR_MORE: _('expected at least one argument'),
2151 }
Federico Bondbe5c79e2019-11-20 10:29:29 -03002152 msg = nargs_errors.get(action.nargs)
2153 if msg is None:
2154 msg = ngettext('expected %s argument',
Éric Araujo12159152010-12-04 17:31:49 +00002155 'expected %s arguments',
2156 action.nargs) % action.nargs
Benjamin Peterson698a18a2010-03-02 22:34:37 +00002157 raise ArgumentError(action, msg)
2158
2159 # return the number of arguments matched
2160 return len(match.group(1))
2161
2162 def _match_arguments_partial(self, actions, arg_strings_pattern):
2163 # progressively shorten the actions list by slicing off the
2164 # final actions until we find a match
2165 result = []
2166 for i in range(len(actions), 0, -1):
2167 actions_slice = actions[:i]
2168 pattern = ''.join([self._get_nargs_pattern(action)
2169 for action in actions_slice])
2170 match = _re.match(pattern, arg_strings_pattern)
2171 if match is not None:
2172 result.extend([len(string) for string in match.groups()])
2173 break
2174
2175 # return the list of arg string counts
2176 return result
2177
2178 def _parse_optional(self, arg_string):
2179 # if it's an empty string, it was meant to be a positional
2180 if not arg_string:
2181 return None
2182
2183 # if it doesn't start with a prefix, it was meant to be positional
2184 if not arg_string[0] in self.prefix_chars:
2185 return None
2186
2187 # if the option string is present in the parser, return the action
2188 if arg_string in self._option_string_actions:
2189 action = self._option_string_actions[arg_string]
2190 return action, arg_string, None
2191
2192 # if it's just a single character, it was meant to be positional
2193 if len(arg_string) == 1:
2194 return None
2195
2196 # if the option string before the "=" is present, return the action
2197 if '=' in arg_string:
2198 option_string, explicit_arg = arg_string.split('=', 1)
2199 if option_string in self._option_string_actions:
2200 action = self._option_string_actions[option_string]
2201 return action, option_string, explicit_arg
2202
Kyle Meyer8edfc472020-02-18 04:48:57 -05002203 # search through all possible prefixes of the option string
2204 # and all actions in the parser for possible interpretations
2205 option_tuples = self._get_option_tuples(arg_string)
Benjamin Peterson698a18a2010-03-02 22:34:37 +00002206
Kyle Meyer8edfc472020-02-18 04:48:57 -05002207 # if multiple actions match, the option string was ambiguous
2208 if len(option_tuples) > 1:
2209 options = ', '.join([option_string
2210 for action, option_string, explicit_arg in option_tuples])
2211 args = {'option': arg_string, 'matches': options}
2212 msg = _('ambiguous option: %(option)s could match %(matches)s')
2213 self.error(msg % args)
Benjamin Peterson698a18a2010-03-02 22:34:37 +00002214
Kyle Meyer8edfc472020-02-18 04:48:57 -05002215 # if exactly one action matched, this segmentation is good,
2216 # so return the parsed action
2217 elif len(option_tuples) == 1:
2218 option_tuple, = option_tuples
2219 return option_tuple
Benjamin Peterson698a18a2010-03-02 22:34:37 +00002220
2221 # if it was not found as an option, but it looks like a negative
2222 # number, it was meant to be positional
2223 # unless there are negative-number-like options
2224 if self._negative_number_matcher.match(arg_string):
2225 if not self._has_negative_number_optionals:
2226 return None
2227
2228 # if it contains a space, it was meant to be a positional
2229 if ' ' in arg_string:
2230 return None
2231
2232 # it was meant to be an optional but there is no such option
2233 # in this parser (though it might be a valid option in a subparser)
2234 return None, arg_string, None
2235
2236 def _get_option_tuples(self, option_string):
2237 result = []
2238
2239 # option strings starting with two prefix characters are only
2240 # split at the '='
2241 chars = self.prefix_chars
2242 if option_string[0] in chars and option_string[1] in chars:
Kyle Meyer8edfc472020-02-18 04:48:57 -05002243 if self.allow_abbrev:
2244 if '=' in option_string:
2245 option_prefix, explicit_arg = option_string.split('=', 1)
2246 else:
2247 option_prefix = option_string
2248 explicit_arg = None
2249 for option_string in self._option_string_actions:
2250 if option_string.startswith(option_prefix):
2251 action = self._option_string_actions[option_string]
2252 tup = action, option_string, explicit_arg
2253 result.append(tup)
Benjamin Peterson698a18a2010-03-02 22:34:37 +00002254
2255 # single character options can be concatenated with their arguments
2256 # but multiple character options always have to have their argument
2257 # separate
2258 elif option_string[0] in chars and option_string[1] not in chars:
2259 option_prefix = option_string
2260 explicit_arg = None
2261 short_option_prefix = option_string[:2]
2262 short_explicit_arg = option_string[2:]
2263
2264 for option_string in self._option_string_actions:
2265 if option_string == short_option_prefix:
2266 action = self._option_string_actions[option_string]
2267 tup = action, option_string, short_explicit_arg
2268 result.append(tup)
2269 elif option_string.startswith(option_prefix):
2270 action = self._option_string_actions[option_string]
2271 tup = action, option_string, explicit_arg
2272 result.append(tup)
2273
2274 # shouldn't ever get here
2275 else:
2276 self.error(_('unexpected option string: %s') % option_string)
2277
2278 # return the collected option tuples
2279 return result
2280
2281 def _get_nargs_pattern(self, action):
2282 # in all examples below, we have to allow for '--' args
2283 # which are represented as '-' in the pattern
2284 nargs = action.nargs
2285
2286 # the default (None) is assumed to be a single argument
2287 if nargs is None:
2288 nargs_pattern = '(-*A-*)'
2289
2290 # allow zero or one arguments
2291 elif nargs == OPTIONAL:
2292 nargs_pattern = '(-*A?-*)'
2293
2294 # allow zero or more arguments
2295 elif nargs == ZERO_OR_MORE:
2296 nargs_pattern = '(-*[A-]*)'
2297
2298 # allow one or more arguments
2299 elif nargs == ONE_OR_MORE:
2300 nargs_pattern = '(-*A[A-]*)'
2301
2302 # allow any number of options or arguments
2303 elif nargs == REMAINDER:
2304 nargs_pattern = '([-AO]*)'
2305
2306 # allow one argument followed by any number of options or arguments
2307 elif nargs == PARSER:
2308 nargs_pattern = '(-*A[-AO]*)'
2309
R. David Murray0f6b9d22017-09-06 20:25:40 -04002310 # suppress action, like nargs=0
2311 elif nargs == SUPPRESS:
2312 nargs_pattern = '(-*-*)'
2313
Benjamin Peterson698a18a2010-03-02 22:34:37 +00002314 # all others should be integers
2315 else:
2316 nargs_pattern = '(-*%s-*)' % '-*'.join('A' * nargs)
2317
2318 # if this is an optional action, -- is not allowed
2319 if action.option_strings:
2320 nargs_pattern = nargs_pattern.replace('-*', '')
2321 nargs_pattern = nargs_pattern.replace('-', '')
2322
2323 # return the pattern
2324 return nargs_pattern
2325
2326 # ========================
R. David Murray0f6b9d22017-09-06 20:25:40 -04002327 # Alt command line argument parsing, allowing free intermix
2328 # ========================
2329
2330 def parse_intermixed_args(self, args=None, namespace=None):
2331 args, argv = self.parse_known_intermixed_args(args, namespace)
2332 if argv:
2333 msg = _('unrecognized arguments: %s')
2334 self.error(msg % ' '.join(argv))
2335 return args
2336
2337 def parse_known_intermixed_args(self, args=None, namespace=None):
2338 # returns a namespace and list of extras
2339 #
2340 # positional can be freely intermixed with optionals. optionals are
2341 # first parsed with all positional arguments deactivated. The 'extras'
2342 # are then parsed. If the parser definition is incompatible with the
2343 # intermixed assumptions (e.g. use of REMAINDER, subparsers) a
2344 # TypeError is raised.
2345 #
2346 # positionals are 'deactivated' by setting nargs and default to
2347 # SUPPRESS. This blocks the addition of that positional to the
2348 # namespace
2349
2350 positionals = self._get_positional_actions()
2351 a = [action for action in positionals
2352 if action.nargs in [PARSER, REMAINDER]]
2353 if a:
2354 raise TypeError('parse_intermixed_args: positional arg'
2355 ' with nargs=%s'%a[0].nargs)
2356
2357 if [action.dest for group in self._mutually_exclusive_groups
2358 for action in group._group_actions if action in positionals]:
2359 raise TypeError('parse_intermixed_args: positional in'
2360 ' mutuallyExclusiveGroup')
2361
2362 try:
2363 save_usage = self.usage
2364 try:
2365 if self.usage is None:
2366 # capture the full usage for use in error messages
2367 self.usage = self.format_usage()[7:]
2368 for action in positionals:
2369 # deactivate positionals
2370 action.save_nargs = action.nargs
2371 # action.nargs = 0
2372 action.nargs = SUPPRESS
2373 action.save_default = action.default
2374 action.default = SUPPRESS
2375 namespace, remaining_args = self.parse_known_args(args,
2376 namespace)
2377 for action in positionals:
2378 # remove the empty positional values from namespace
2379 if (hasattr(namespace, action.dest)
2380 and getattr(namespace, action.dest)==[]):
2381 from warnings import warn
2382 warn('Do not expect %s in %s' % (action.dest, namespace))
2383 delattr(namespace, action.dest)
2384 finally:
2385 # restore nargs and usage before exiting
2386 for action in positionals:
2387 action.nargs = action.save_nargs
2388 action.default = action.save_default
2389 optionals = self._get_optional_actions()
2390 try:
2391 # parse positionals. optionals aren't normally required, but
2392 # they could be, so make sure they aren't.
2393 for action in optionals:
2394 action.save_required = action.required
2395 action.required = False
2396 for group in self._mutually_exclusive_groups:
2397 group.save_required = group.required
2398 group.required = False
2399 namespace, extras = self.parse_known_args(remaining_args,
2400 namespace)
2401 finally:
2402 # restore parser values before exiting
2403 for action in optionals:
2404 action.required = action.save_required
2405 for group in self._mutually_exclusive_groups:
2406 group.required = group.save_required
2407 finally:
2408 self.usage = save_usage
2409 return namespace, extras
2410
2411 # ========================
Benjamin Peterson698a18a2010-03-02 22:34:37 +00002412 # Value conversion methods
2413 # ========================
2414 def _get_values(self, action, arg_strings):
R David Murray00528e82012-07-21 22:48:35 -04002415 # for everything but PARSER, REMAINDER args, strip out first '--'
Benjamin Peterson698a18a2010-03-02 22:34:37 +00002416 if action.nargs not in [PARSER, REMAINDER]:
R David Murray00528e82012-07-21 22:48:35 -04002417 try:
2418 arg_strings.remove('--')
2419 except ValueError:
2420 pass
Benjamin Peterson698a18a2010-03-02 22:34:37 +00002421
2422 # optional argument produces a default when not present
2423 if not arg_strings and action.nargs == OPTIONAL:
2424 if action.option_strings:
2425 value = action.const
2426 else:
2427 value = action.default
Benjamin Peterson16f2fd02010-03-02 23:09:38 +00002428 if isinstance(value, str):
Benjamin Peterson698a18a2010-03-02 22:34:37 +00002429 value = self._get_value(action, value)
2430 self._check_value(action, value)
2431
2432 # when nargs='*' on a positional, if there were no command-line
2433 # args, use the default if it is anything other than None
2434 elif (not arg_strings and action.nargs == ZERO_OR_MORE and
2435 not action.option_strings):
2436 if action.default is not None:
2437 value = action.default
2438 else:
2439 value = arg_strings
2440 self._check_value(action, value)
2441
2442 # single argument or optional argument produces a single value
2443 elif len(arg_strings) == 1 and action.nargs in [None, OPTIONAL]:
2444 arg_string, = arg_strings
2445 value = self._get_value(action, arg_string)
2446 self._check_value(action, value)
2447
2448 # REMAINDER arguments convert all values, checking none
2449 elif action.nargs == REMAINDER:
2450 value = [self._get_value(action, v) for v in arg_strings]
2451
2452 # PARSER arguments convert all values, but check only the first
2453 elif action.nargs == PARSER:
2454 value = [self._get_value(action, v) for v in arg_strings]
2455 self._check_value(action, value[0])
2456
R. David Murray0f6b9d22017-09-06 20:25:40 -04002457 # SUPPRESS argument does not put anything in the namespace
2458 elif action.nargs == SUPPRESS:
2459 value = SUPPRESS
2460
Benjamin Peterson698a18a2010-03-02 22:34:37 +00002461 # all other types of nargs produce a list
2462 else:
2463 value = [self._get_value(action, v) for v in arg_strings]
2464 for v in value:
2465 self._check_value(action, v)
2466
2467 # return the converted value
2468 return value
2469
2470 def _get_value(self, action, arg_string):
2471 type_func = self._registry_get('type', action.type, action.type)
Florent Xicluna5d1155c2011-10-28 14:45:05 +02002472 if not callable(type_func):
Benjamin Peterson698a18a2010-03-02 22:34:37 +00002473 msg = _('%r is not callable')
2474 raise ArgumentError(action, msg % type_func)
2475
2476 # convert the value to the appropriate type
2477 try:
2478 result = type_func(arg_string)
2479
2480 # ArgumentTypeErrors indicate errors
2481 except ArgumentTypeError:
2482 name = getattr(action.type, '__name__', repr(action.type))
2483 msg = str(_sys.exc_info()[1])
2484 raise ArgumentError(action, msg)
2485
2486 # TypeErrors or ValueErrors also indicate errors
2487 except (TypeError, ValueError):
2488 name = getattr(action.type, '__name__', repr(action.type))
Éric Araujobb48a8b2010-12-03 19:41:00 +00002489 args = {'type': name, 'value': arg_string}
2490 msg = _('invalid %(type)s value: %(value)r')
2491 raise ArgumentError(action, msg % args)
Benjamin Peterson698a18a2010-03-02 22:34:37 +00002492
2493 # return the converted value
2494 return result
2495
2496 def _check_value(self, action, value):
2497 # converted value must be one of the choices (if specified)
Vinay Sajip9ae50502016-08-23 08:43:16 +01002498 if action.choices is not None and value not in action.choices:
2499 args = {'value': value,
2500 'choices': ', '.join(map(repr, action.choices))}
2501 msg = _('invalid choice: %(value)r (choose from %(choices)s)')
2502 raise ArgumentError(action, msg % args)
Benjamin Peterson698a18a2010-03-02 22:34:37 +00002503
2504 # =======================
2505 # Help-formatting methods
2506 # =======================
2507 def format_usage(self):
2508 formatter = self._get_formatter()
2509 formatter.add_usage(self.usage, self._actions,
2510 self._mutually_exclusive_groups)
2511 return formatter.format_help()
2512
2513 def format_help(self):
2514 formatter = self._get_formatter()
2515
2516 # usage
2517 formatter.add_usage(self.usage, self._actions,
2518 self._mutually_exclusive_groups)
2519
2520 # description
2521 formatter.add_text(self.description)
2522
2523 # positionals, optionals and user-defined groups
2524 for action_group in self._action_groups:
2525 formatter.start_section(action_group.title)
2526 formatter.add_text(action_group.description)
2527 formatter.add_arguments(action_group._group_actions)
2528 formatter.end_section()
2529
2530 # epilog
2531 formatter.add_text(self.epilog)
2532
2533 # determine help from format above
2534 return formatter.format_help()
2535
Benjamin Peterson698a18a2010-03-02 22:34:37 +00002536 def _get_formatter(self):
2537 return self.formatter_class(prog=self.prog)
2538
2539 # =====================
2540 # Help-printing methods
2541 # =====================
2542 def print_usage(self, file=None):
2543 if file is None:
2544 file = _sys.stdout
2545 self._print_message(self.format_usage(), file)
2546
2547 def print_help(self, file=None):
2548 if file is None:
2549 file = _sys.stdout
2550 self._print_message(self.format_help(), file)
2551
Benjamin Peterson698a18a2010-03-02 22:34:37 +00002552 def _print_message(self, message, file=None):
2553 if message:
2554 if file is None:
2555 file = _sys.stderr
2556 file.write(message)
2557
2558 # ===============
2559 # Exiting methods
2560 # ===============
2561 def exit(self, status=0, message=None):
2562 if message:
2563 self._print_message(message, _sys.stderr)
2564 _sys.exit(status)
2565
2566 def error(self, message):
2567 """error(message: string)
2568
2569 Prints a usage message incorporating the message to stderr and
2570 exits.
2571
2572 If you override this in a subclass, it should not return -- it
2573 should either exit or raise an exception.
2574 """
2575 self.print_usage(_sys.stderr)
Éric Araujobb48a8b2010-12-03 19:41:00 +00002576 args = {'prog': self.prog, 'message': message}
2577 self.exit(2, _('%(prog)s: error: %(message)s\n') % args)