CMS 3D CMS Logo

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