evennia/docs/5.x/_modules/argparse.html
2025-07-01 10:01:48 +02:00

2791 lines
No EOL
381 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>argparse &#8212; Evennia latest documentation</title>
<link rel="stylesheet" href="../_static/nature.css" type="text/css" />
<link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=d75fae25" />
<link rel="stylesheet" type="text/css" href="../_static/nature.css?v=245aff17" />
<script id="documentation_options" data-url_root="../" src="../_static/documentation_options.js"></script>
<script src="../_static/documentation_options.js?v=c6e86fd7"></script>
<script src="../_static/doctools.js?v=9bcbadda"></script>
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
</head><body>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="General Index"
accesskey="I">index</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../index.html">Evennia latest</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Module code</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">argparse</a></li>
</ul>
</div>
<div class="document">
<div class="documentwrapper">
<div class="sphinxsidebar" role="navigation" aria-label="main navigation">
<div class="sphinxsidebarwrapper">
<search id="searchbox" style="display: none" role="search">
<h3 id="searchlabel">Quick search</h3>
<div class="searchformwrapper">
<form class="search" action="../search.html" method="get">
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
<input type="submit" value="Go" />
</form>
</div>
</search>
<script>document.getElementById('searchbox').style.display = "block"</script><h3>Links</h3>
<ul>
<li><a href="https://www.evennia.com/docs/latest/index.html">Documentation Top</a> </li>
<li><a href="https://www.evennia.com">Evennia Home</a> </li>
<li><a href="https://github.com/evennia/evennia">Github</a> </li>
<li><a href="http://games.evennia.com">Game Index</a> </li>
<li>
<a href="https://discord.gg/AJJpcRUhtF">Discord</a> -
<a href="https://github.com/evennia/evennia/discussions">Discussions</a> -
<a href="https://evennia.blogspot.com/">Blog</a>
</li>
</ul>
</div>
</div>
<div class="bodywrapper">
<div class="body" role="main">
<h1>Source code for argparse</h1><div class="highlight"><pre>
<span></span><span class="c1"># Author: Steven J. Bethard &lt;steven.bethard@gmail.com&gt;.</span>
<span class="c1"># New maintainer as of 29 August 2019: Raymond Hettinger &lt;raymond.hettinger@gmail.com&gt;</span>
<span class="sd">&quot;&quot;&quot;Command-line parsing library</span>
<span class="sd">This module is an optparse-inspired command-line parsing library that:</span>
<span class="sd"> - handles both optional and positional arguments</span>
<span class="sd"> - produces highly informative usage messages</span>
<span class="sd"> - supports parsers that dispatch to sub-parsers</span>
<span class="sd">The following is a simple usage example that sums integers from the</span>
<span class="sd">command-line and writes the result to a file::</span>
<span class="sd"> parser = argparse.ArgumentParser(</span>
<span class="sd"> description=&#39;sum the integers at the command line&#39;)</span>
<span class="sd"> parser.add_argument(</span>
<span class="sd"> &#39;integers&#39;, metavar=&#39;int&#39;, nargs=&#39;+&#39;, type=int,</span>
<span class="sd"> help=&#39;an integer to be summed&#39;)</span>
<span class="sd"> parser.add_argument(</span>
<span class="sd"> &#39;--log&#39;, default=sys.stdout, type=argparse.FileType(&#39;w&#39;),</span>
<span class="sd"> help=&#39;the file where the sum should be written&#39;)</span>
<span class="sd"> args = parser.parse_args()</span>
<span class="sd"> args.log.write(&#39;%s&#39; % sum(args.integers))</span>
<span class="sd"> args.log.close()</span>
<span class="sd">The module contains the following public classes:</span>
<span class="sd"> - ArgumentParser -- The main entry point for command-line parsing. As the</span>
<span class="sd"> example above shows, the add_argument() method is used to populate</span>
<span class="sd"> the parser with actions for optional and positional arguments. Then</span>
<span class="sd"> the parse_args() method is invoked to convert the args at the</span>
<span class="sd"> command-line into an object with attributes.</span>
<span class="sd"> - ArgumentError -- The exception raised by ArgumentParser objects when</span>
<span class="sd"> there are errors with the parser&#39;s actions. Errors raised while</span>
<span class="sd"> parsing the command-line are caught by ArgumentParser and emitted</span>
<span class="sd"> as command-line messages.</span>
<span class="sd"> - FileType -- A factory for defining types of files to be created. As the</span>
<span class="sd"> example above shows, instances of FileType are typically passed as</span>
<span class="sd"> the type= argument of add_argument() calls.</span>
<span class="sd"> - Action -- The base class for parser actions. Typically actions are</span>
<span class="sd"> selected by passing strings like &#39;store_true&#39; or &#39;append_const&#39; to</span>
<span class="sd"> the action= argument of add_argument(). However, for greater</span>
<span class="sd"> customization of ArgumentParser actions, subclasses of Action may</span>
<span class="sd"> be defined and passed as the action= argument.</span>
<span class="sd"> - HelpFormatter, RawDescriptionHelpFormatter, RawTextHelpFormatter,</span>
<span class="sd"> ArgumentDefaultsHelpFormatter -- Formatter classes which</span>
<span class="sd"> may be passed as the formatter_class= argument to the</span>
<span class="sd"> ArgumentParser constructor. HelpFormatter is the default,</span>
<span class="sd"> RawDescriptionHelpFormatter and RawTextHelpFormatter tell the parser</span>
<span class="sd"> not to change the formatting for help text, and</span>
<span class="sd"> ArgumentDefaultsHelpFormatter adds information about argument defaults</span>
<span class="sd"> to the help.</span>
<span class="sd">All other classes in this module are considered implementation details.</span>
<span class="sd">(Also note that HelpFormatter and RawDescriptionHelpFormatter are only</span>
<span class="sd">considered public as object names -- the API of the formatter objects is</span>
<span class="sd">still considered an implementation detail.)</span>
<span class="sd">&quot;&quot;&quot;</span>
<span class="n">__version__</span> <span class="o">=</span> <span class="s1">&#39;1.1&#39;</span>
<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span>
<span class="s1">&#39;ArgumentParser&#39;</span><span class="p">,</span>
<span class="s1">&#39;ArgumentError&#39;</span><span class="p">,</span>
<span class="s1">&#39;ArgumentTypeError&#39;</span><span class="p">,</span>
<span class="s1">&#39;BooleanOptionalAction&#39;</span><span class="p">,</span>
<span class="s1">&#39;FileType&#39;</span><span class="p">,</span>
<span class="s1">&#39;HelpFormatter&#39;</span><span class="p">,</span>
<span class="s1">&#39;ArgumentDefaultsHelpFormatter&#39;</span><span class="p">,</span>
<span class="s1">&#39;RawDescriptionHelpFormatter&#39;</span><span class="p">,</span>
<span class="s1">&#39;RawTextHelpFormatter&#39;</span><span class="p">,</span>
<span class="s1">&#39;MetavarTypeHelpFormatter&#39;</span><span class="p">,</span>
<span class="s1">&#39;Namespace&#39;</span><span class="p">,</span>
<span class="s1">&#39;Action&#39;</span><span class="p">,</span>
<span class="s1">&#39;ONE_OR_MORE&#39;</span><span class="p">,</span>
<span class="s1">&#39;OPTIONAL&#39;</span><span class="p">,</span>
<span class="s1">&#39;PARSER&#39;</span><span class="p">,</span>
<span class="s1">&#39;REMAINDER&#39;</span><span class="p">,</span>
<span class="s1">&#39;SUPPRESS&#39;</span><span class="p">,</span>
<span class="s1">&#39;ZERO_OR_MORE&#39;</span><span class="p">,</span>
<span class="p">]</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">os</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">_os</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">re</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">_re</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">sys</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nn">_sys</span>
<span class="kn">from</span><span class="w"> </span><span class="nn">gettext</span><span class="w"> </span><span class="kn">import</span> <span class="n">gettext</span> <span class="k">as</span> <span class="n">_</span><span class="p">,</span> <span class="n">ngettext</span>
<span class="n">SUPPRESS</span> <span class="o">=</span> <span class="s1">&#39;==SUPPRESS==&#39;</span>
<span class="n">OPTIONAL</span> <span class="o">=</span> <span class="s1">&#39;?&#39;</span>
<span class="n">ZERO_OR_MORE</span> <span class="o">=</span> <span class="s1">&#39;*&#39;</span>
<span class="n">ONE_OR_MORE</span> <span class="o">=</span> <span class="s1">&#39;+&#39;</span>
<span class="n">PARSER</span> <span class="o">=</span> <span class="s1">&#39;A...&#39;</span>
<span class="n">REMAINDER</span> <span class="o">=</span> <span class="s1">&#39;...&#39;</span>
<span class="n">_UNRECOGNIZED_ARGS_ATTR</span> <span class="o">=</span> <span class="s1">&#39;_unrecognized_args&#39;</span>
<span class="c1"># =============================</span>
<span class="c1"># Utility functions and classes</span>
<span class="c1"># =============================</span>
<span class="k">class</span><span class="w"> </span><span class="nc">_AttributeHolder</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Abstract base class that provides __repr__.</span>
<span class="sd"> The __repr__ method returns a string in the format::</span>
<span class="sd"> ClassName(attr=name, attr=name, ...)</span>
<span class="sd"> The attributes are determined either by a class-level attribute,</span>
<span class="sd"> &#39;_kwarg_names&#39;, or by inspecting the instance __dict__.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">type_name</span> <span class="o">=</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span>
<span class="n">arg_strings</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">star_args</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_args</span><span class="p">():</span>
<span class="n">arg_strings</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">arg</span><span class="p">))</span>
<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_kwargs</span><span class="p">():</span>
<span class="k">if</span> <span class="n">name</span><span class="o">.</span><span class="n">isidentifier</span><span class="p">():</span>
<span class="n">arg_strings</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%s</span><span class="s1">=</span><span class="si">%r</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">star_args</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">value</span>
<span class="k">if</span> <span class="n">star_args</span><span class="p">:</span>
<span class="n">arg_strings</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;**</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="nb">repr</span><span class="p">(</span><span class="n">star_args</span><span class="p">))</span>
<span class="k">return</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">(</span><span class="si">%s</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">type_name</span><span class="p">,</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">arg_strings</span><span class="p">))</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_kwargs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">items</span><span class="p">())</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_args</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_copy_items</span><span class="p">(</span><span class="n">items</span><span class="p">):</span>
<span class="k">if</span> <span class="n">items</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="c1"># The copy module is used only in the &#39;append&#39; and &#39;append_const&#39;</span>
<span class="c1"># actions, and it is needed only when the default value isn&#39;t a list.</span>
<span class="c1"># Delay its import for speeding up the common case.</span>
<span class="k">if</span> <span class="nb">type</span><span class="p">(</span><span class="n">items</span><span class="p">)</span> <span class="ow">is</span> <span class="nb">list</span><span class="p">:</span>
<span class="k">return</span> <span class="n">items</span><span class="p">[:]</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">copy</span>
<span class="k">return</span> <span class="n">copy</span><span class="o">.</span><span class="n">copy</span><span class="p">(</span><span class="n">items</span><span class="p">)</span>
<span class="c1"># ===============</span>
<span class="c1"># Formatting Help</span>
<span class="c1"># ===============</span>
<span class="k">class</span><span class="w"> </span><span class="nc">HelpFormatter</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Formatter for generating usage messages and argument help strings.</span>
<span class="sd"> Only the name of this class is considered a public API. All the methods</span>
<span class="sd"> provided by the class are considered an implementation detail.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">prog</span><span class="p">,</span>
<span class="n">indent_increment</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span>
<span class="n">max_help_position</span><span class="o">=</span><span class="mi">24</span><span class="p">,</span>
<span class="n">width</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="c1"># default setting for width</span>
<span class="k">if</span> <span class="n">width</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">shutil</span>
<span class="n">width</span> <span class="o">=</span> <span class="n">shutil</span><span class="o">.</span><span class="n">get_terminal_size</span><span class="p">()</span><span class="o">.</span><span class="n">columns</span>
<span class="n">width</span> <span class="o">-=</span> <span class="mi">2</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_prog</span> <span class="o">=</span> <span class="n">prog</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_indent_increment</span> <span class="o">=</span> <span class="n">indent_increment</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_max_help_position</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">max_help_position</span><span class="p">,</span>
<span class="nb">max</span><span class="p">(</span><span class="n">width</span> <span class="o">-</span> <span class="mi">20</span><span class="p">,</span> <span class="n">indent_increment</span> <span class="o">*</span> <span class="mi">2</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_width</span> <span class="o">=</span> <span class="n">width</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_current_indent</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_level</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_action_max_length</span> <span class="o">=</span> <span class="mi">0</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_root_section</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_Section</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_current_section</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_root_section</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_whitespace_matcher</span> <span class="o">=</span> <span class="n">_re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;\s+&#39;</span><span class="p">,</span> <span class="n">_re</span><span class="o">.</span><span class="n">ASCII</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_long_break_matcher</span> <span class="o">=</span> <span class="n">_re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;\n\n\n+&#39;</span><span class="p">)</span>
<span class="c1"># ===============================</span>
<span class="c1"># Section and indentation methods</span>
<span class="c1"># ===============================</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_indent</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_current_indent</span> <span class="o">+=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_indent_increment</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_level</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_dedent</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_current_indent</span> <span class="o">-=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_indent_increment</span>
<span class="k">assert</span> <span class="bp">self</span><span class="o">.</span><span class="n">_current_indent</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">,</span> <span class="s1">&#39;Indent decreased below 0.&#39;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_level</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="k">class</span><span class="w"> </span><span class="nc">_Section</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">formatter</span><span class="p">,</span> <span class="n">parent</span><span class="p">,</span> <span class="n">heading</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">formatter</span> <span class="o">=</span> <span class="n">formatter</span>
<span class="bp">self</span><span class="o">.</span><span class="n">parent</span> <span class="o">=</span> <span class="n">parent</span>
<span class="bp">self</span><span class="o">.</span><span class="n">heading</span> <span class="o">=</span> <span class="n">heading</span>
<span class="bp">self</span><span class="o">.</span><span class="n">items</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">format_help</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># format the indented section</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">formatter</span><span class="o">.</span><span class="n">_indent</span><span class="p">()</span>
<span class="n">join</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">formatter</span><span class="o">.</span><span class="n">_join_parts</span>
<span class="n">item_help</span> <span class="o">=</span> <span class="n">join</span><span class="p">([</span><span class="n">func</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span> <span class="k">for</span> <span class="n">func</span><span class="p">,</span> <span class="n">args</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">items</span><span class="p">])</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">parent</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">formatter</span><span class="o">.</span><span class="n">_dedent</span><span class="p">()</span>
<span class="c1"># return nothing if the section was empty</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">item_help</span><span class="p">:</span>
<span class="k">return</span> <span class="s1">&#39;&#39;</span>
<span class="c1"># add the heading if the section was non-empty</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">heading</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">SUPPRESS</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">heading</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">current_indent</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">formatter</span><span class="o">.</span><span class="n">_current_indent</span>
<span class="n">heading_text</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%(heading)s</span><span class="s1">:&#39;</span><span class="p">)</span> <span class="o">%</span> <span class="nb">dict</span><span class="p">(</span><span class="n">heading</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">heading</span><span class="p">)</span>
<span class="n">heading</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%*s%s</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">current_indent</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">heading_text</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">heading</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
<span class="c1"># join the section-initial newline, the heading and the help</span>
<span class="k">return</span> <span class="n">join</span><span class="p">([</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">heading</span><span class="p">,</span> <span class="n">item_help</span><span class="p">,</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">])</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_add_item</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">func</span><span class="p">,</span> <span class="n">args</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_current_section</span><span class="o">.</span><span class="n">items</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">func</span><span class="p">,</span> <span class="n">args</span><span class="p">))</span>
<span class="c1"># ========================</span>
<span class="c1"># Message building methods</span>
<span class="c1"># ========================</span>
<span class="k">def</span><span class="w"> </span><span class="nf">start_section</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">heading</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_indent</span><span class="p">()</span>
<span class="n">section</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_Section</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_current_section</span><span class="p">,</span> <span class="n">heading</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_add_item</span><span class="p">(</span><span class="n">section</span><span class="o">.</span><span class="n">format_help</span><span class="p">,</span> <span class="p">[])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_current_section</span> <span class="o">=</span> <span class="n">section</span>
<span class="k">def</span><span class="w"> </span><span class="nf">end_section</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_current_section</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_current_section</span><span class="o">.</span><span class="n">parent</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_dedent</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">add_text</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">):</span>
<span class="k">if</span> <span class="n">text</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">SUPPRESS</span> <span class="ow">and</span> <span class="n">text</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_add_item</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_format_text</span><span class="p">,</span> <span class="p">[</span><span class="n">text</span><span class="p">])</span>
<span class="k">def</span><span class="w"> </span><span class="nf">add_usage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">usage</span><span class="p">,</span> <span class="n">actions</span><span class="p">,</span> <span class="n">groups</span><span class="p">,</span> <span class="n">prefix</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">usage</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">SUPPRESS</span><span class="p">:</span>
<span class="n">args</span> <span class="o">=</span> <span class="n">usage</span><span class="p">,</span> <span class="n">actions</span><span class="p">,</span> <span class="n">groups</span><span class="p">,</span> <span class="n">prefix</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_add_item</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_format_usage</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">add_argument</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">help</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">SUPPRESS</span><span class="p">:</span>
<span class="c1"># find all invocations</span>
<span class="n">get_invocation</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_format_action_invocation</span>
<span class="n">invocation_lengths</span> <span class="o">=</span> <span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">get_invocation</span><span class="p">(</span><span class="n">action</span><span class="p">))</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">_current_indent</span><span class="p">]</span>
<span class="k">for</span> <span class="n">subaction</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_iter_indented_subactions</span><span class="p">(</span><span class="n">action</span><span class="p">):</span>
<span class="n">invocation_lengths</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">get_invocation</span><span class="p">(</span><span class="n">subaction</span><span class="p">))</span> <span class="o">+</span> <span class="bp">self</span><span class="o">.</span><span class="n">_current_indent</span><span class="p">)</span>
<span class="c1"># update the maximum item length</span>
<span class="n">action_length</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">invocation_lengths</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_action_max_length</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_action_max_length</span><span class="p">,</span>
<span class="n">action_length</span><span class="p">)</span>
<span class="c1"># add the item to the list</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_add_item</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_format_action</span><span class="p">,</span> <span class="p">[</span><span class="n">action</span><span class="p">])</span>
<span class="k">def</span><span class="w"> </span><span class="nf">add_arguments</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">actions</span><span class="p">):</span>
<span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="n">actions</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="c1"># =======================</span>
<span class="c1"># Help-formatting methods</span>
<span class="c1"># =======================</span>
<span class="k">def</span><span class="w"> </span><span class="nf">format_help</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">help</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_root_section</span><span class="o">.</span><span class="n">format_help</span><span class="p">()</span>
<span class="k">if</span> <span class="n">help</span><span class="p">:</span>
<span class="n">help</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_long_break_matcher</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n\n</span><span class="s1">&#39;</span><span class="p">,</span> <span class="n">help</span><span class="p">)</span>
<span class="n">help</span> <span class="o">=</span> <span class="n">help</span><span class="o">.</span><span class="n">strip</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span>
<span class="k">return</span> <span class="n">help</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_join_parts</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">part_strings</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">part</span>
<span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">part_strings</span>
<span class="k">if</span> <span class="n">part</span> <span class="ow">and</span> <span class="n">part</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">SUPPRESS</span><span class="p">])</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_format_usage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">usage</span><span class="p">,</span> <span class="n">actions</span><span class="p">,</span> <span class="n">groups</span><span class="p">,</span> <span class="n">prefix</span><span class="p">):</span>
<span class="k">if</span> <span class="n">prefix</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">prefix</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;usage: &#39;</span><span class="p">)</span>
<span class="c1"># if usage is specified, use that</span>
<span class="k">if</span> <span class="n">usage</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">usage</span> <span class="o">=</span> <span class="n">usage</span> <span class="o">%</span> <span class="nb">dict</span><span class="p">(</span><span class="n">prog</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_prog</span><span class="p">)</span>
<span class="c1"># if no optionals or positionals are available, usage is just prog</span>
<span class="k">elif</span> <span class="n">usage</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">actions</span><span class="p">:</span>
<span class="n">usage</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%(prog)s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="nb">dict</span><span class="p">(</span><span class="n">prog</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_prog</span><span class="p">)</span>
<span class="c1"># if optionals and positionals are available, calculate usage</span>
<span class="k">elif</span> <span class="n">usage</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">prog</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%(prog)s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="nb">dict</span><span class="p">(</span><span class="n">prog</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_prog</span><span class="p">)</span>
<span class="c1"># split optionals from positionals</span>
<span class="n">optionals</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">positionals</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="n">actions</span><span class="p">:</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">option_strings</span><span class="p">:</span>
<span class="n">optionals</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">positionals</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="c1"># build full usage string</span>
<span class="nb">format</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_format_actions_usage</span>
<span class="n">action_usage</span> <span class="o">=</span> <span class="nb">format</span><span class="p">(</span><span class="n">optionals</span> <span class="o">+</span> <span class="n">positionals</span><span class="p">,</span> <span class="n">groups</span><span class="p">)</span>
<span class="n">usage</span> <span class="o">=</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">s</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="p">[</span><span class="n">prog</span><span class="p">,</span> <span class="n">action_usage</span><span class="p">]</span> <span class="k">if</span> <span class="n">s</span><span class="p">])</span>
<span class="c1"># wrap the usage parts if it&#39;s too long</span>
<span class="n">text_width</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_width</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">_current_indent</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">prefix</span><span class="p">)</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">usage</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">text_width</span><span class="p">:</span>
<span class="c1"># break usage into wrappable parts</span>
<span class="n">opt_parts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_actions_usage_parts</span><span class="p">(</span><span class="n">optionals</span><span class="p">,</span> <span class="n">groups</span><span class="p">)</span>
<span class="n">pos_parts</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_actions_usage_parts</span><span class="p">(</span><span class="n">positionals</span><span class="p">,</span> <span class="n">groups</span><span class="p">)</span>
<span class="c1"># helper for wrapping lines</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_lines</span><span class="p">(</span><span class="n">parts</span><span class="p">,</span> <span class="n">indent</span><span class="p">,</span> <span class="n">prefix</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">lines</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">line</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">indent_length</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">indent</span><span class="p">)</span>
<span class="k">if</span> <span class="n">prefix</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">line_len</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">prefix</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">line_len</span> <span class="o">=</span> <span class="n">indent_length</span> <span class="o">-</span> <span class="mi">1</span>
<span class="k">for</span> <span class="n">part</span> <span class="ow">in</span> <span class="n">parts</span><span class="p">:</span>
<span class="k">if</span> <span class="n">line_len</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">part</span><span class="p">)</span> <span class="o">&gt;</span> <span class="n">text_width</span> <span class="ow">and</span> <span class="n">line</span><span class="p">:</span>
<span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">indent</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">line</span><span class="p">))</span>
<span class="n">line</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">line_len</span> <span class="o">=</span> <span class="n">indent_length</span> <span class="o">-</span> <span class="mi">1</span>
<span class="n">line</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">part</span><span class="p">)</span>
<span class="n">line_len</span> <span class="o">+=</span> <span class="nb">len</span><span class="p">(</span><span class="n">part</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
<span class="k">if</span> <span class="n">line</span><span class="p">:</span>
<span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">indent</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">line</span><span class="p">))</span>
<span class="k">if</span> <span class="n">prefix</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">lines</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="n">lines</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="n">indent_length</span><span class="p">:]</span>
<span class="k">return</span> <span class="n">lines</span>
<span class="c1"># if prog is short, follow it with optionals or positionals</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">prefix</span><span class="p">)</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">prog</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mf">0.75</span> <span class="o">*</span> <span class="n">text_width</span><span class="p">:</span>
<span class="n">indent</span> <span class="o">=</span> <span class="s1">&#39; &#39;</span> <span class="o">*</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">prefix</span><span class="p">)</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">prog</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">if</span> <span class="n">opt_parts</span><span class="p">:</span>
<span class="n">lines</span> <span class="o">=</span> <span class="n">get_lines</span><span class="p">([</span><span class="n">prog</span><span class="p">]</span> <span class="o">+</span> <span class="n">opt_parts</span><span class="p">,</span> <span class="n">indent</span><span class="p">,</span> <span class="n">prefix</span><span class="p">)</span>
<span class="n">lines</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">get_lines</span><span class="p">(</span><span class="n">pos_parts</span><span class="p">,</span> <span class="n">indent</span><span class="p">))</span>
<span class="k">elif</span> <span class="n">pos_parts</span><span class="p">:</span>
<span class="n">lines</span> <span class="o">=</span> <span class="n">get_lines</span><span class="p">([</span><span class="n">prog</span><span class="p">]</span> <span class="o">+</span> <span class="n">pos_parts</span><span class="p">,</span> <span class="n">indent</span><span class="p">,</span> <span class="n">prefix</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">lines</span> <span class="o">=</span> <span class="p">[</span><span class="n">prog</span><span class="p">]</span>
<span class="c1"># if prog is long, put it on its own line</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">indent</span> <span class="o">=</span> <span class="s1">&#39; &#39;</span> <span class="o">*</span> <span class="nb">len</span><span class="p">(</span><span class="n">prefix</span><span class="p">)</span>
<span class="n">parts</span> <span class="o">=</span> <span class="n">opt_parts</span> <span class="o">+</span> <span class="n">pos_parts</span>
<span class="n">lines</span> <span class="o">=</span> <span class="n">get_lines</span><span class="p">(</span><span class="n">parts</span><span class="p">,</span> <span class="n">indent</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">lines</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">lines</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">get_lines</span><span class="p">(</span><span class="n">opt_parts</span><span class="p">,</span> <span class="n">indent</span><span class="p">))</span>
<span class="n">lines</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">get_lines</span><span class="p">(</span><span class="n">pos_parts</span><span class="p">,</span> <span class="n">indent</span><span class="p">))</span>
<span class="n">lines</span> <span class="o">=</span> <span class="p">[</span><span class="n">prog</span><span class="p">]</span> <span class="o">+</span> <span class="n">lines</span>
<span class="c1"># join lines into usage</span>
<span class="n">usage</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span>
<span class="c1"># prefix with &#39;usage:&#39;</span>
<span class="k">return</span> <span class="s1">&#39;</span><span class="si">%s%s</span><span class="se">\n\n</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">prefix</span><span class="p">,</span> <span class="n">usage</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_format_actions_usage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">actions</span><span class="p">,</span> <span class="n">groups</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_actions_usage_parts</span><span class="p">(</span><span class="n">actions</span><span class="p">,</span> <span class="n">groups</span><span class="p">))</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_actions_usage_parts</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">actions</span><span class="p">,</span> <span class="n">groups</span><span class="p">):</span>
<span class="c1"># find group indices and identify actions in groups</span>
<span class="n">group_actions</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="n">inserts</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">group</span> <span class="ow">in</span> <span class="n">groups</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">group</span><span class="o">.</span><span class="n">_group_actions</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;empty group </span><span class="si">{</span><span class="n">group</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">all</span><span class="p">(</span><span class="n">action</span><span class="o">.</span><span class="n">help</span> <span class="ow">is</span> <span class="n">SUPPRESS</span> <span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="n">group</span><span class="o">.</span><span class="n">_group_actions</span><span class="p">):</span>
<span class="k">continue</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">start</span> <span class="o">=</span> <span class="n">actions</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="n">group</span><span class="o">.</span><span class="n">_group_actions</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
<span class="k">continue</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">end</span> <span class="o">=</span> <span class="n">start</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">group</span><span class="o">.</span><span class="n">_group_actions</span><span class="p">)</span>
<span class="k">if</span> <span class="n">actions</span><span class="p">[</span><span class="n">start</span><span class="p">:</span><span class="n">end</span><span class="p">]</span> <span class="o">==</span> <span class="n">group</span><span class="o">.</span><span class="n">_group_actions</span><span class="p">:</span>
<span class="n">group_actions</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">group</span><span class="o">.</span><span class="n">_group_actions</span><span class="p">)</span>
<span class="n">inserts</span><span class="p">[</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">]</span> <span class="o">=</span> <span class="n">group</span>
<span class="c1"># collect all actions format strings</span>
<span class="n">parts</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="n">actions</span><span class="p">:</span>
<span class="c1"># suppressed arguments are marked with None</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">help</span> <span class="ow">is</span> <span class="n">SUPPRESS</span><span class="p">:</span>
<span class="n">part</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># produce all arg strings</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="n">action</span><span class="o">.</span><span class="n">option_strings</span><span class="p">:</span>
<span class="n">default</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_default_metavar_for_positional</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="n">part</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_format_args</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">default</span><span class="p">)</span>
<span class="c1"># if it&#39;s in a group, strip the outer []</span>
<span class="k">if</span> <span class="n">action</span> <span class="ow">in</span> <span class="n">group_actions</span><span class="p">:</span>
<span class="k">if</span> <span class="n">part</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;[&#39;</span> <span class="ow">and</span> <span class="n">part</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;]&#39;</span><span class="p">:</span>
<span class="n">part</span> <span class="o">=</span> <span class="n">part</span><span class="p">[</span><span class="mi">1</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="c1"># produce the first way to invoke the option in brackets</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">option_string</span> <span class="o">=</span> <span class="n">action</span><span class="o">.</span><span class="n">option_strings</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c1"># if the Optional doesn&#39;t take a value, format is:</span>
<span class="c1"># -s or --long</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">nargs</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="n">part</span> <span class="o">=</span> <span class="n">action</span><span class="o">.</span><span class="n">format_usage</span><span class="p">()</span>
<span class="c1"># if the Optional takes a value, format is:</span>
<span class="c1"># -s ARGS or --long ARGS</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">default</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_default_metavar_for_optional</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="n">args_string</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_format_args</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">default</span><span class="p">)</span>
<span class="n">part</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1"> </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">option_string</span><span class="p">,</span> <span class="n">args_string</span><span class="p">)</span>
<span class="c1"># make it look optional if it&#39;s not required or in a group</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">action</span><span class="o">.</span><span class="n">required</span> <span class="ow">and</span> <span class="n">action</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">group_actions</span><span class="p">:</span>
<span class="n">part</span> <span class="o">=</span> <span class="s1">&#39;[</span><span class="si">%s</span><span class="s1">]&#39;</span> <span class="o">%</span> <span class="n">part</span>
<span class="c1"># add the action string to the list</span>
<span class="n">parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">part</span><span class="p">)</span>
<span class="c1"># group mutually exclusive actions</span>
<span class="n">inserted_separators_indices</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="k">for</span> <span class="n">start</span><span class="p">,</span> <span class="n">end</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">inserts</span><span class="p">,</span> <span class="n">reverse</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="n">group</span> <span class="o">=</span> <span class="n">inserts</span><span class="p">[</span><span class="n">start</span><span class="p">,</span> <span class="n">end</span><span class="p">]</span>
<span class="n">group_parts</span> <span class="o">=</span> <span class="p">[</span><span class="n">item</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">parts</span><span class="p">[</span><span class="n">start</span><span class="p">:</span><span class="n">end</span><span class="p">]</span> <span class="k">if</span> <span class="n">item</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">]</span>
<span class="n">group_size</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">group_parts</span><span class="p">)</span>
<span class="k">if</span> <span class="n">group</span><span class="o">.</span><span class="n">required</span><span class="p">:</span>
<span class="nb">open</span><span class="p">,</span> <span class="n">close</span> <span class="o">=</span> <span class="s2">&quot;()&quot;</span> <span class="k">if</span> <span class="n">group_size</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="k">else</span> <span class="p">(</span><span class="s2">&quot;&quot;</span><span class="p">,</span> <span class="s2">&quot;&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">open</span><span class="p">,</span> <span class="n">close</span> <span class="o">=</span> <span class="s2">&quot;[]&quot;</span>
<span class="n">group_parts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="nb">open</span> <span class="o">+</span> <span class="n">group_parts</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">group_parts</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">group_parts</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">close</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">part</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">group_parts</span><span class="p">[:</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">start</span><span class="o">=</span><span class="n">start</span><span class="p">):</span>
<span class="c1"># insert a separator if not already done in a nested group</span>
<span class="k">if</span> <span class="n">i</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">inserted_separators_indices</span><span class="p">:</span>
<span class="n">parts</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">part</span> <span class="o">+</span> <span class="s1">&#39; |&#39;</span>
<span class="n">inserted_separators_indices</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">i</span><span class="p">)</span>
<span class="n">parts</span><span class="p">[</span><span class="n">start</span> <span class="o">+</span> <span class="n">group_size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">group_parts</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">start</span> <span class="o">+</span> <span class="n">group_size</span><span class="p">,</span> <span class="n">end</span><span class="p">):</span>
<span class="n">parts</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># return the usage parts</span>
<span class="k">return</span> <span class="p">[</span><span class="n">item</span> <span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">parts</span> <span class="k">if</span> <span class="n">item</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_format_text</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">):</span>
<span class="k">if</span> <span class="s1">&#39;%(prog)&#39;</span> <span class="ow">in</span> <span class="n">text</span><span class="p">:</span>
<span class="n">text</span> <span class="o">=</span> <span class="n">text</span> <span class="o">%</span> <span class="nb">dict</span><span class="p">(</span><span class="n">prog</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_prog</span><span class="p">)</span>
<span class="n">text_width</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_width</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">_current_indent</span><span class="p">,</span> <span class="mi">11</span><span class="p">)</span>
<span class="n">indent</span> <span class="o">=</span> <span class="s1">&#39; &#39;</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">_current_indent</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_fill_text</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">text_width</span><span class="p">,</span> <span class="n">indent</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39;</span><span class="se">\n\n</span><span class="s1">&#39;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_format_action</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
<span class="c1"># determine the required width and the entry label</span>
<span class="n">help_position</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_action_max_length</span> <span class="o">+</span> <span class="mi">2</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_max_help_position</span><span class="p">)</span>
<span class="n">help_width</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_width</span> <span class="o">-</span> <span class="n">help_position</span><span class="p">,</span> <span class="mi">11</span><span class="p">)</span>
<span class="n">action_width</span> <span class="o">=</span> <span class="n">help_position</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">_current_indent</span> <span class="o">-</span> <span class="mi">2</span>
<span class="n">action_header</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_format_action_invocation</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="c1"># no help; start on same line and add a final newline</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">action</span><span class="o">.</span><span class="n">help</span><span class="p">:</span>
<span class="n">tup</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_current_indent</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">action_header</span>
<span class="n">action_header</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%*s%s</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">tup</span>
<span class="c1"># short action name; start on the same line and pad two spaces</span>
<span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">action_header</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="n">action_width</span><span class="p">:</span>
<span class="n">tup</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_current_indent</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">action_width</span><span class="p">,</span> <span class="n">action_header</span>
<span class="n">action_header</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%*s%-*s</span><span class="s1"> &#39;</span> <span class="o">%</span> <span class="n">tup</span>
<span class="n">indent_first</span> <span class="o">=</span> <span class="mi">0</span>
<span class="c1"># long action name; start on the next line</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">tup</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_current_indent</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">action_header</span>
<span class="n">action_header</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%*s%s</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">tup</span>
<span class="n">indent_first</span> <span class="o">=</span> <span class="n">help_position</span>
<span class="c1"># collect the pieces of the action help</span>
<span class="n">parts</span> <span class="o">=</span> <span class="p">[</span><span class="n">action_header</span><span class="p">]</span>
<span class="c1"># if there was help for the action, add lines of help text</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">help</span> <span class="ow">and</span> <span class="n">action</span><span class="o">.</span><span class="n">help</span><span class="o">.</span><span class="n">strip</span><span class="p">():</span>
<span class="n">help_text</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_expand_help</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="k">if</span> <span class="n">help_text</span><span class="p">:</span>
<span class="n">help_lines</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_split_lines</span><span class="p">(</span><span class="n">help_text</span><span class="p">,</span> <span class="n">help_width</span><span class="p">)</span>
<span class="n">parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%*s%s</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">indent_first</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">help_lines</span><span class="p">[</span><span class="mi">0</span><span class="p">]))</span>
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">help_lines</span><span class="p">[</span><span class="mi">1</span><span class="p">:]:</span>
<span class="n">parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%*s%s</span><span class="se">\n</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">help_position</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">line</span><span class="p">))</span>
<span class="c1"># or add a newline if the description doesn&#39;t end with one</span>
<span class="k">elif</span> <span class="ow">not</span> <span class="n">action_header</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">):</span>
<span class="n">parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span>
<span class="c1"># if there are any sub-actions, add their help as well</span>
<span class="k">for</span> <span class="n">subaction</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_iter_indented_subactions</span><span class="p">(</span><span class="n">action</span><span class="p">):</span>
<span class="n">parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_format_action</span><span class="p">(</span><span class="n">subaction</span><span class="p">))</span>
<span class="c1"># return a single string</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_join_parts</span><span class="p">(</span><span class="n">parts</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_format_action_invocation</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">action</span><span class="o">.</span><span class="n">option_strings</span><span class="p">:</span>
<span class="n">default</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_default_metavar_for_positional</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="k">return</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_metavar_formatter</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">default</span><span class="p">)(</span><span class="mi">1</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># if the Optional doesn&#39;t take a value, format is:</span>
<span class="c1"># -s, --long</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">nargs</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">return</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">action</span><span class="o">.</span><span class="n">option_strings</span><span class="p">)</span>
<span class="c1"># if the Optional takes a value, format is:</span>
<span class="c1"># -s, --long ARGS</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">default</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_default_metavar_for_optional</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="n">args_string</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_format_args</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">default</span><span class="p">)</span>
<span class="k">return</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">action</span><span class="o">.</span><span class="n">option_strings</span><span class="p">)</span> <span class="o">+</span> <span class="s1">&#39; &#39;</span> <span class="o">+</span> <span class="n">args_string</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_metavar_formatter</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="n">default_metavar</span><span class="p">):</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">metavar</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">action</span><span class="o">.</span><span class="n">metavar</span>
<span class="k">elif</span> <span class="n">action</span><span class="o">.</span><span class="n">choices</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="s1">&#39;{</span><span class="si">%s</span><span class="s1">}&#39;</span> <span class="o">%</span> <span class="s1">&#39;,&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">action</span><span class="o">.</span><span class="n">choices</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">default_metavar</span>
<span class="k">def</span><span class="w"> </span><span class="nf">format</span><span class="p">(</span><span class="n">tuple_size</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
<span class="k">return</span> <span class="n">result</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="p">)</span> <span class="o">*</span> <span class="n">tuple_size</span>
<span class="k">return</span> <span class="nb">format</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_format_args</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="n">default_metavar</span><span class="p">):</span>
<span class="n">get_metavar</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_metavar_formatter</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">default_metavar</span><span class="p">)</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">nargs</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="n">get_metavar</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">action</span><span class="o">.</span><span class="n">nargs</span> <span class="o">==</span> <span class="n">OPTIONAL</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="s1">&#39;[</span><span class="si">%s</span><span class="s1">]&#39;</span> <span class="o">%</span> <span class="n">get_metavar</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">action</span><span class="o">.</span><span class="n">nargs</span> <span class="o">==</span> <span class="n">ZERO_OR_MORE</span><span class="p">:</span>
<span class="n">metavar</span> <span class="o">=</span> <span class="n">get_metavar</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">metavar</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="s1">&#39;[</span><span class="si">%s</span><span class="s1"> [</span><span class="si">%s</span><span class="s1"> ...]]&#39;</span> <span class="o">%</span> <span class="n">metavar</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="s1">&#39;[</span><span class="si">%s</span><span class="s1"> ...]&#39;</span> <span class="o">%</span> <span class="n">metavar</span>
<span class="k">elif</span> <span class="n">action</span><span class="o">.</span><span class="n">nargs</span> <span class="o">==</span> <span class="n">ONE_OR_MORE</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1"> [</span><span class="si">%s</span><span class="s1"> ...]&#39;</span> <span class="o">%</span> <span class="n">get_metavar</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">action</span><span class="o">.</span><span class="n">nargs</span> <span class="o">==</span> <span class="n">REMAINDER</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="s1">&#39;...&#39;</span>
<span class="k">elif</span> <span class="n">action</span><span class="o">.</span><span class="n">nargs</span> <span class="o">==</span> <span class="n">PARSER</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1"> ...&#39;</span> <span class="o">%</span> <span class="n">get_metavar</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">action</span><span class="o">.</span><span class="n">nargs</span> <span class="o">==</span> <span class="n">SUPPRESS</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">formats</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">action</span><span class="o">.</span><span class="n">nargs</span><span class="p">)]</span>
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;invalid nargs value&quot;</span><span class="p">)</span> <span class="kn">from</span><span class="w"> </span><span class="kc">None</span>
<span class="n">result</span> <span class="o">=</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">formats</span><span class="p">)</span> <span class="o">%</span> <span class="n">get_metavar</span><span class="p">(</span><span class="n">action</span><span class="o">.</span><span class="n">nargs</span><span class="p">)</span>
<span class="k">return</span> <span class="n">result</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_expand_help</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
<span class="n">params</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">(</span><span class="nb">vars</span><span class="p">(</span><span class="n">action</span><span class="p">),</span> <span class="n">prog</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_prog</span><span class="p">)</span>
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">params</span><span class="p">):</span>
<span class="k">if</span> <span class="n">params</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="ow">is</span> <span class="n">SUPPRESS</span><span class="p">:</span>
<span class="k">del</span> <span class="n">params</span><span class="p">[</span><span class="n">name</span><span class="p">]</span>
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="nb">list</span><span class="p">(</span><span class="n">params</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">params</span><span class="p">[</span><span class="n">name</span><span class="p">],</span> <span class="s1">&#39;__name__&#39;</span><span class="p">):</span>
<span class="n">params</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">params</span><span class="p">[</span><span class="n">name</span><span class="p">]</span><span class="o">.</span><span class="vm">__name__</span>
<span class="k">if</span> <span class="n">params</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;choices&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">params</span><span class="p">[</span><span class="s1">&#39;choices&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">params</span><span class="p">[</span><span class="s1">&#39;choices&#39;</span><span class="p">]))</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_help_string</span><span class="p">(</span><span class="n">action</span><span class="p">)</span> <span class="o">%</span> <span class="n">params</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_iter_indented_subactions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">get_subactions</span> <span class="o">=</span> <span class="n">action</span><span class="o">.</span><span class="n">_get_subactions</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="k">pass</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_indent</span><span class="p">()</span>
<span class="k">yield from</span> <span class="n">get_subactions</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_dedent</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_split_lines</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">width</span><span class="p">):</span>
<span class="n">text</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_whitespace_matcher</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="c1"># The textwrap module is used only for formatting help.</span>
<span class="c1"># Delay its import for speeding up the common usage of argparse.</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">textwrap</span>
<span class="k">return</span> <span class="n">textwrap</span><span class="o">.</span><span class="n">wrap</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">width</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_fill_text</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">indent</span><span class="p">):</span>
<span class="n">text</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_whitespace_matcher</span><span class="o">.</span><span class="n">sub</span><span class="p">(</span><span class="s1">&#39; &#39;</span><span class="p">,</span> <span class="n">text</span><span class="p">)</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">textwrap</span>
<span class="k">return</span> <span class="n">textwrap</span><span class="o">.</span><span class="n">fill</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span>
<span class="n">initial_indent</span><span class="o">=</span><span class="n">indent</span><span class="p">,</span>
<span class="n">subsequent_indent</span><span class="o">=</span><span class="n">indent</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_help_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
<span class="k">return</span> <span class="n">action</span><span class="o">.</span><span class="n">help</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_default_metavar_for_optional</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
<span class="k">return</span> <span class="n">action</span><span class="o">.</span><span class="n">dest</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_default_metavar_for_positional</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
<span class="k">return</span> <span class="n">action</span><span class="o">.</span><span class="n">dest</span>
<span class="k">class</span><span class="w"> </span><span class="nc">RawDescriptionHelpFormatter</span><span class="p">(</span><span class="n">HelpFormatter</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Help message formatter which retains any formatting in descriptions.</span>
<span class="sd"> Only the name of this class is considered a public API. All the methods</span>
<span class="sd"> provided by the class are considered an implementation detail.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_fill_text</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">width</span><span class="p">,</span> <span class="n">indent</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">indent</span> <span class="o">+</span> <span class="n">line</span> <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">text</span><span class="o">.</span><span class="n">splitlines</span><span class="p">(</span><span class="n">keepends</span><span class="o">=</span><span class="kc">True</span><span class="p">))</span>
<span class="k">class</span><span class="w"> </span><span class="nc">RawTextHelpFormatter</span><span class="p">(</span><span class="n">RawDescriptionHelpFormatter</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Help message formatter which retains formatting of all help text.</span>
<span class="sd"> Only the name of this class is considered a public API. All the methods</span>
<span class="sd"> provided by the class are considered an implementation detail.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_split_lines</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text</span><span class="p">,</span> <span class="n">width</span><span class="p">):</span>
<span class="k">return</span> <span class="n">text</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span>
<span class="k">class</span><span class="w"> </span><span class="nc">ArgumentDefaultsHelpFormatter</span><span class="p">(</span><span class="n">HelpFormatter</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Help message formatter which adds default values to argument help.</span>
<span class="sd"> Only the name of this class is considered a public API. All the methods</span>
<span class="sd"> provided by the class are considered an implementation detail.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_help_string</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
<span class="n">help</span> <span class="o">=</span> <span class="n">action</span><span class="o">.</span><span class="n">help</span>
<span class="k">if</span> <span class="n">help</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">help</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
<span class="k">if</span> <span class="s1">&#39;%(default)&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">help</span><span class="p">:</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">default</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">SUPPRESS</span><span class="p">:</span>
<span class="n">defaulting_nargs</span> <span class="o">=</span> <span class="p">[</span><span class="n">OPTIONAL</span><span class="p">,</span> <span class="n">ZERO_OR_MORE</span><span class="p">]</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">option_strings</span> <span class="ow">or</span> <span class="n">action</span><span class="o">.</span><span class="n">nargs</span> <span class="ow">in</span> <span class="n">defaulting_nargs</span><span class="p">:</span>
<span class="n">help</span> <span class="o">+=</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39; (default: </span><span class="si">%(default)s</span><span class="s1">)&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">help</span>
<span class="k">class</span><span class="w"> </span><span class="nc">MetavarTypeHelpFormatter</span><span class="p">(</span><span class="n">HelpFormatter</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Help message formatter which uses the argument &#39;type&#39; as the default</span>
<span class="sd"> metavar value (instead of the argument &#39;dest&#39;)</span>
<span class="sd"> Only the name of this class is considered a public API. All the methods</span>
<span class="sd"> provided by the class are considered an implementation detail.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_default_metavar_for_optional</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
<span class="k">return</span> <span class="n">action</span><span class="o">.</span><span class="n">type</span><span class="o">.</span><span class="vm">__name__</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_default_metavar_for_positional</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
<span class="k">return</span> <span class="n">action</span><span class="o">.</span><span class="n">type</span><span class="o">.</span><span class="vm">__name__</span>
<span class="c1"># =====================</span>
<span class="c1"># Options and Arguments</span>
<span class="c1"># =====================</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_action_name</span><span class="p">(</span><span class="n">argument</span><span class="p">):</span>
<span class="k">if</span> <span class="n">argument</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">elif</span> <span class="n">argument</span><span class="o">.</span><span class="n">option_strings</span><span class="p">:</span>
<span class="k">return</span> <span class="s1">&#39;/&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">argument</span><span class="o">.</span><span class="n">option_strings</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">argument</span><span class="o">.</span><span class="n">metavar</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">SUPPRESS</span><span class="p">):</span>
<span class="n">metavar</span> <span class="o">=</span> <span class="n">argument</span><span class="o">.</span><span class="n">metavar</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">metavar</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
<span class="k">return</span> <span class="n">metavar</span>
<span class="k">if</span> <span class="n">argument</span><span class="o">.</span><span class="n">nargs</span> <span class="o">==</span> <span class="n">ZERO_OR_MORE</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">metavar</span><span class="p">)</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
<span class="k">return</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">[, </span><span class="si">%s</span><span class="s1">]&#39;</span> <span class="o">%</span> <span class="n">metavar</span>
<span class="k">elif</span> <span class="n">argument</span><span class="o">.</span><span class="n">nargs</span> <span class="o">==</span> <span class="n">ONE_OR_MORE</span><span class="p">:</span>
<span class="k">return</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">[, </span><span class="si">%s</span><span class="s1">]&#39;</span> <span class="o">%</span> <span class="n">metavar</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">metavar</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">argument</span><span class="o">.</span><span class="n">dest</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">SUPPRESS</span><span class="p">):</span>
<span class="k">return</span> <span class="n">argument</span><span class="o">.</span><span class="n">dest</span>
<span class="k">elif</span> <span class="n">argument</span><span class="o">.</span><span class="n">choices</span><span class="p">:</span>
<span class="k">return</span> <span class="s1">&#39;{</span><span class="si">%s</span><span class="s1">}&#39;</span> <span class="o">%</span> <span class="s1">&#39;,&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">argument</span><span class="o">.</span><span class="n">choices</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="k">class</span><span class="w"> </span><span class="nc">ArgumentError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;An error from creating or using an argument (optional or positional).</span>
<span class="sd"> The string value of this exception is the message, augmented with</span>
<span class="sd"> information about the argument that caused it.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">argument</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">argument_name</span> <span class="o">=</span> <span class="n">_get_action_name</span><span class="p">(</span><span class="n">argument</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">message</span> <span class="o">=</span> <span class="n">message</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">argument_name</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="nb">format</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%(message)s</span><span class="s1">&#39;</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">format</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;argument </span><span class="si">%(argument_name)s</span><span class="s1">: </span><span class="si">%(message)s</span><span class="s1">&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="nb">format</span> <span class="o">%</span> <span class="nb">dict</span><span class="p">(</span><span class="n">message</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">message</span><span class="p">,</span>
<span class="n">argument_name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">argument_name</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">ArgumentTypeError</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;An error from trying to convert a command line string to a type.&quot;&quot;&quot;</span>
<span class="k">pass</span>
<span class="c1"># ==============</span>
<span class="c1"># Action classes</span>
<span class="c1"># ==============</span>
<span class="k">class</span><span class="w"> </span><span class="nc">Action</span><span class="p">(</span><span class="n">_AttributeHolder</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Information about how to convert command line strings to Python objects.</span>
<span class="sd"> Action objects are used by an ArgumentParser to represent the information</span>
<span class="sd"> needed to parse a single argument from one or more strings from the</span>
<span class="sd"> command line. The keyword arguments to the Action constructor are also</span>
<span class="sd"> all attributes of Action instances.</span>
<span class="sd"> Keyword Arguments:</span>
<span class="sd"> - option_strings -- A list of command-line option strings which</span>
<span class="sd"> should be associated with this action.</span>
<span class="sd"> - dest -- The name of the attribute to hold the created object(s)</span>
<span class="sd"> - nargs -- The number of command-line arguments that should be</span>
<span class="sd"> consumed. By default, one argument will be consumed and a single</span>
<span class="sd"> value will be produced. Other values include:</span>
<span class="sd"> - N (an integer) consumes N arguments (and produces a list)</span>
<span class="sd"> - &#39;?&#39; consumes zero or one arguments</span>
<span class="sd"> - &#39;*&#39; consumes zero or more arguments (and produces a list)</span>
<span class="sd"> - &#39;+&#39; consumes one or more arguments (and produces a list)</span>
<span class="sd"> Note that the difference between the default and nargs=1 is that</span>
<span class="sd"> with the default, a single value will be produced, while with</span>
<span class="sd"> nargs=1, a list containing a single value will be produced.</span>
<span class="sd"> - const -- The value to be produced if the option is specified and the</span>
<span class="sd"> option uses an action that takes no values.</span>
<span class="sd"> - default -- The value to be produced if the option is not specified.</span>
<span class="sd"> - type -- A callable that accepts a single string argument, and</span>
<span class="sd"> returns the converted value. The standard Python types str, int,</span>
<span class="sd"> float, and complex are useful examples of such callables. If None,</span>
<span class="sd"> str is used.</span>
<span class="sd"> - choices -- A container of values that should be allowed. If not None,</span>
<span class="sd"> after a command-line argument has been converted to the appropriate</span>
<span class="sd"> type, an exception will be raised if it is not a member of this</span>
<span class="sd"> collection.</span>
<span class="sd"> - required -- True if the action must always be specified at the</span>
<span class="sd"> command line. This is only meaningful for optional command-line</span>
<span class="sd"> arguments.</span>
<span class="sd"> - help -- The help string describing the argument.</span>
<span class="sd"> - metavar -- The name to be used for the option&#39;s argument with the</span>
<span class="sd"> help string. If None, the &#39;dest&#39; value will be used as the name.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">option_strings</span><span class="p">,</span>
<span class="n">dest</span><span class="p">,</span>
<span class="n">nargs</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">const</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="nb">type</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">choices</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">required</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">metavar</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">deprecated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">option_strings</span> <span class="o">=</span> <span class="n">option_strings</span>
<span class="bp">self</span><span class="o">.</span><span class="n">dest</span> <span class="o">=</span> <span class="n">dest</span>
<span class="bp">self</span><span class="o">.</span><span class="n">nargs</span> <span class="o">=</span> <span class="n">nargs</span>
<span class="bp">self</span><span class="o">.</span><span class="n">const</span> <span class="o">=</span> <span class="n">const</span>
<span class="bp">self</span><span class="o">.</span><span class="n">default</span> <span class="o">=</span> <span class="n">default</span>
<span class="bp">self</span><span class="o">.</span><span class="n">type</span> <span class="o">=</span> <span class="nb">type</span>
<span class="bp">self</span><span class="o">.</span><span class="n">choices</span> <span class="o">=</span> <span class="n">choices</span>
<span class="bp">self</span><span class="o">.</span><span class="n">required</span> <span class="o">=</span> <span class="n">required</span>
<span class="bp">self</span><span class="o">.</span><span class="n">help</span> <span class="o">=</span> <span class="n">help</span>
<span class="bp">self</span><span class="o">.</span><span class="n">metavar</span> <span class="o">=</span> <span class="n">metavar</span>
<span class="bp">self</span><span class="o">.</span><span class="n">deprecated</span> <span class="o">=</span> <span class="n">deprecated</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_kwargs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">names</span> <span class="o">=</span> <span class="p">[</span>
<span class="s1">&#39;option_strings&#39;</span><span class="p">,</span>
<span class="s1">&#39;dest&#39;</span><span class="p">,</span>
<span class="s1">&#39;nargs&#39;</span><span class="p">,</span>
<span class="s1">&#39;const&#39;</span><span class="p">,</span>
<span class="s1">&#39;default&#39;</span><span class="p">,</span>
<span class="s1">&#39;type&#39;</span><span class="p">,</span>
<span class="s1">&#39;choices&#39;</span><span class="p">,</span>
<span class="s1">&#39;required&#39;</span><span class="p">,</span>
<span class="s1">&#39;help&#39;</span><span class="p">,</span>
<span class="s1">&#39;metavar&#39;</span><span class="p">,</span>
<span class="s1">&#39;deprecated&#39;</span><span class="p">,</span>
<span class="p">]</span>
<span class="k">return</span> <span class="p">[(</span><span class="n">name</span><span class="p">,</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">names</span><span class="p">]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">format_usage</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">option_strings</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">namespace</span><span class="p">,</span> <span class="n">values</span><span class="p">,</span> <span class="n">option_string</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">NotImplementedError</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s1">&#39;.__call__() not defined&#39;</span><span class="p">))</span>
<span class="c1"># FIXME: remove together with `BooleanOptionalAction` deprecated arguments.</span>
<span class="n">_deprecated_default</span> <span class="o">=</span> <span class="nb">object</span><span class="p">()</span>
<span class="k">class</span><span class="w"> </span><span class="nc">BooleanOptionalAction</span><span class="p">(</span><span class="n">Action</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">option_strings</span><span class="p">,</span>
<span class="n">dest</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="nb">type</span><span class="o">=</span><span class="n">_deprecated_default</span><span class="p">,</span>
<span class="n">choices</span><span class="o">=</span><span class="n">_deprecated_default</span><span class="p">,</span>
<span class="n">required</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">metavar</span><span class="o">=</span><span class="n">_deprecated_default</span><span class="p">,</span>
<span class="n">deprecated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="n">_option_strings</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">option_string</span> <span class="ow">in</span> <span class="n">option_strings</span><span class="p">:</span>
<span class="n">_option_strings</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">option_string</span><span class="p">)</span>
<span class="k">if</span> <span class="n">option_string</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;--&#39;</span><span class="p">):</span>
<span class="n">option_string</span> <span class="o">=</span> <span class="s1">&#39;--no-&#39;</span> <span class="o">+</span> <span class="n">option_string</span><span class="p">[</span><span class="mi">2</span><span class="p">:]</span>
<span class="n">_option_strings</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">option_string</span><span class="p">)</span>
<span class="c1"># We need `_deprecated` special value to ban explicit arguments that</span>
<span class="c1"># match default value. Like:</span>
<span class="c1"># parser.add_argument(&#39;-f&#39;, action=BooleanOptionalAction, type=int)</span>
<span class="k">for</span> <span class="n">field_name</span> <span class="ow">in</span> <span class="p">(</span><span class="s1">&#39;type&#39;</span><span class="p">,</span> <span class="s1">&#39;choices&#39;</span><span class="p">,</span> <span class="s1">&#39;metavar&#39;</span><span class="p">):</span>
<span class="k">if</span> <span class="nb">locals</span><span class="p">()[</span><span class="n">field_name</span><span class="p">]</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">_deprecated_default</span><span class="p">:</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">warnings</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">_deprecated</span><span class="p">(</span>
<span class="n">field_name</span><span class="p">,</span>
<span class="s2">&quot;</span><span class="si">{name!r}</span><span class="s2"> is deprecated as of Python 3.12 and will be &quot;</span>
<span class="s2">&quot;removed in Python </span><span class="si">{remove}</span><span class="s2">.&quot;</span><span class="p">,</span>
<span class="n">remove</span><span class="o">=</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">14</span><span class="p">))</span>
<span class="k">if</span> <span class="nb">type</span> <span class="ow">is</span> <span class="n">_deprecated_default</span><span class="p">:</span>
<span class="nb">type</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">choices</span> <span class="ow">is</span> <span class="n">_deprecated_default</span><span class="p">:</span>
<span class="n">choices</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">if</span> <span class="n">metavar</span> <span class="ow">is</span> <span class="n">_deprecated_default</span><span class="p">:</span>
<span class="n">metavar</span> <span class="o">=</span> <span class="kc">None</span>
<span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span>
<span class="n">option_strings</span><span class="o">=</span><span class="n">_option_strings</span><span class="p">,</span>
<span class="n">dest</span><span class="o">=</span><span class="n">dest</span><span class="p">,</span>
<span class="n">nargs</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span>
<span class="nb">type</span><span class="o">=</span><span class="nb">type</span><span class="p">,</span>
<span class="n">choices</span><span class="o">=</span><span class="n">choices</span><span class="p">,</span>
<span class="n">required</span><span class="o">=</span><span class="n">required</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="n">help</span><span class="p">,</span>
<span class="n">metavar</span><span class="o">=</span><span class="n">metavar</span><span class="p">,</span>
<span class="n">deprecated</span><span class="o">=</span><span class="n">deprecated</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">namespace</span><span class="p">,</span> <span class="n">values</span><span class="p">,</span> <span class="n">option_string</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">option_string</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">option_strings</span><span class="p">:</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dest</span><span class="p">,</span> <span class="ow">not</span> <span class="n">option_string</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s1">&#39;--no-&#39;</span><span class="p">))</span>
<span class="k">def</span><span class="w"> </span><span class="nf">format_usage</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">&#39; | &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">option_strings</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">_StoreAction</span><span class="p">(</span><span class="n">Action</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">option_strings</span><span class="p">,</span>
<span class="n">dest</span><span class="p">,</span>
<span class="n">nargs</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">const</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="nb">type</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">choices</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">required</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">metavar</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">deprecated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="k">if</span> <span class="n">nargs</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;nargs for store actions must be != 0; if you &#39;</span>
<span class="s1">&#39;have nothing to store, actions such as store &#39;</span>
<span class="s1">&#39;true or store const may be more appropriate&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">const</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">nargs</span> <span class="o">!=</span> <span class="n">OPTIONAL</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;nargs must be </span><span class="si">%r</span><span class="s1"> to supply const&#39;</span> <span class="o">%</span> <span class="n">OPTIONAL</span><span class="p">)</span>
<span class="nb">super</span><span class="p">(</span><span class="n">_StoreAction</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span>
<span class="n">option_strings</span><span class="o">=</span><span class="n">option_strings</span><span class="p">,</span>
<span class="n">dest</span><span class="o">=</span><span class="n">dest</span><span class="p">,</span>
<span class="n">nargs</span><span class="o">=</span><span class="n">nargs</span><span class="p">,</span>
<span class="n">const</span><span class="o">=</span><span class="n">const</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span>
<span class="nb">type</span><span class="o">=</span><span class="nb">type</span><span class="p">,</span>
<span class="n">choices</span><span class="o">=</span><span class="n">choices</span><span class="p">,</span>
<span class="n">required</span><span class="o">=</span><span class="n">required</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="n">help</span><span class="p">,</span>
<span class="n">metavar</span><span class="o">=</span><span class="n">metavar</span><span class="p">,</span>
<span class="n">deprecated</span><span class="o">=</span><span class="n">deprecated</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">namespace</span><span class="p">,</span> <span class="n">values</span><span class="p">,</span> <span class="n">option_string</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dest</span><span class="p">,</span> <span class="n">values</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">_StoreConstAction</span><span class="p">(</span><span class="n">Action</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">option_strings</span><span class="p">,</span>
<span class="n">dest</span><span class="p">,</span>
<span class="n">const</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">required</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">metavar</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">deprecated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">_StoreConstAction</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span>
<span class="n">option_strings</span><span class="o">=</span><span class="n">option_strings</span><span class="p">,</span>
<span class="n">dest</span><span class="o">=</span><span class="n">dest</span><span class="p">,</span>
<span class="n">nargs</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
<span class="n">const</span><span class="o">=</span><span class="n">const</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span>
<span class="n">required</span><span class="o">=</span><span class="n">required</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="n">help</span><span class="p">,</span>
<span class="n">deprecated</span><span class="o">=</span><span class="n">deprecated</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">namespace</span><span class="p">,</span> <span class="n">values</span><span class="p">,</span> <span class="n">option_string</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dest</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">const</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">_StoreTrueAction</span><span class="p">(</span><span class="n">_StoreConstAction</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">option_strings</span><span class="p">,</span>
<span class="n">dest</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">required</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">deprecated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">_StoreTrueAction</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span>
<span class="n">option_strings</span><span class="o">=</span><span class="n">option_strings</span><span class="p">,</span>
<span class="n">dest</span><span class="o">=</span><span class="n">dest</span><span class="p">,</span>
<span class="n">const</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">deprecated</span><span class="o">=</span><span class="n">deprecated</span><span class="p">,</span>
<span class="n">required</span><span class="o">=</span><span class="n">required</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="n">help</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">_StoreFalseAction</span><span class="p">(</span><span class="n">_StoreConstAction</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">option_strings</span><span class="p">,</span>
<span class="n">dest</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">required</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">deprecated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">_StoreFalseAction</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span>
<span class="n">option_strings</span><span class="o">=</span><span class="n">option_strings</span><span class="p">,</span>
<span class="n">dest</span><span class="o">=</span><span class="n">dest</span><span class="p">,</span>
<span class="n">const</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span>
<span class="n">required</span><span class="o">=</span><span class="n">required</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="n">help</span><span class="p">,</span>
<span class="n">deprecated</span><span class="o">=</span><span class="n">deprecated</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">_AppendAction</span><span class="p">(</span><span class="n">Action</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">option_strings</span><span class="p">,</span>
<span class="n">dest</span><span class="p">,</span>
<span class="n">nargs</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">const</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="nb">type</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">choices</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">required</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">metavar</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">deprecated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="k">if</span> <span class="n">nargs</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;nargs for append actions must be != 0; if arg &#39;</span>
<span class="s1">&#39;strings are not supplying the value to append, &#39;</span>
<span class="s1">&#39;the append const action may be more appropriate&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">const</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">nargs</span> <span class="o">!=</span> <span class="n">OPTIONAL</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;nargs must be </span><span class="si">%r</span><span class="s1"> to supply const&#39;</span> <span class="o">%</span> <span class="n">OPTIONAL</span><span class="p">)</span>
<span class="nb">super</span><span class="p">(</span><span class="n">_AppendAction</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span>
<span class="n">option_strings</span><span class="o">=</span><span class="n">option_strings</span><span class="p">,</span>
<span class="n">dest</span><span class="o">=</span><span class="n">dest</span><span class="p">,</span>
<span class="n">nargs</span><span class="o">=</span><span class="n">nargs</span><span class="p">,</span>
<span class="n">const</span><span class="o">=</span><span class="n">const</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span>
<span class="nb">type</span><span class="o">=</span><span class="nb">type</span><span class="p">,</span>
<span class="n">choices</span><span class="o">=</span><span class="n">choices</span><span class="p">,</span>
<span class="n">required</span><span class="o">=</span><span class="n">required</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="n">help</span><span class="p">,</span>
<span class="n">metavar</span><span class="o">=</span><span class="n">metavar</span><span class="p">,</span>
<span class="n">deprecated</span><span class="o">=</span><span class="n">deprecated</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">namespace</span><span class="p">,</span> <span class="n">values</span><span class="p">,</span> <span class="n">option_string</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">items</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dest</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">items</span> <span class="o">=</span> <span class="n">_copy_items</span><span class="p">(</span><span class="n">items</span><span class="p">)</span>
<span class="n">items</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">values</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dest</span><span class="p">,</span> <span class="n">items</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">_AppendConstAction</span><span class="p">(</span><span class="n">Action</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">option_strings</span><span class="p">,</span>
<span class="n">dest</span><span class="p">,</span>
<span class="n">const</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">required</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">metavar</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">deprecated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">_AppendConstAction</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span>
<span class="n">option_strings</span><span class="o">=</span><span class="n">option_strings</span><span class="p">,</span>
<span class="n">dest</span><span class="o">=</span><span class="n">dest</span><span class="p">,</span>
<span class="n">nargs</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
<span class="n">const</span><span class="o">=</span><span class="n">const</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span>
<span class="n">required</span><span class="o">=</span><span class="n">required</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="n">help</span><span class="p">,</span>
<span class="n">metavar</span><span class="o">=</span><span class="n">metavar</span><span class="p">,</span>
<span class="n">deprecated</span><span class="o">=</span><span class="n">deprecated</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">namespace</span><span class="p">,</span> <span class="n">values</span><span class="p">,</span> <span class="n">option_string</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">items</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dest</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">items</span> <span class="o">=</span> <span class="n">_copy_items</span><span class="p">(</span><span class="n">items</span><span class="p">)</span>
<span class="n">items</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">const</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dest</span><span class="p">,</span> <span class="n">items</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">_CountAction</span><span class="p">(</span><span class="n">Action</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">option_strings</span><span class="p">,</span>
<span class="n">dest</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">required</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">deprecated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">_CountAction</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span>
<span class="n">option_strings</span><span class="o">=</span><span class="n">option_strings</span><span class="p">,</span>
<span class="n">dest</span><span class="o">=</span><span class="n">dest</span><span class="p">,</span>
<span class="n">nargs</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span>
<span class="n">required</span><span class="o">=</span><span class="n">required</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="n">help</span><span class="p">,</span>
<span class="n">deprecated</span><span class="o">=</span><span class="n">deprecated</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">namespace</span><span class="p">,</span> <span class="n">values</span><span class="p">,</span> <span class="n">option_string</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">count</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dest</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">count</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">count</span> <span class="o">=</span> <span class="mi">0</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dest</span><span class="p">,</span> <span class="n">count</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">_HelpAction</span><span class="p">(</span><span class="n">Action</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">option_strings</span><span class="p">,</span>
<span class="n">dest</span><span class="o">=</span><span class="n">SUPPRESS</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="n">SUPPRESS</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">deprecated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">_HelpAction</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span>
<span class="n">option_strings</span><span class="o">=</span><span class="n">option_strings</span><span class="p">,</span>
<span class="n">dest</span><span class="o">=</span><span class="n">dest</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span>
<span class="n">nargs</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="n">help</span><span class="p">,</span>
<span class="n">deprecated</span><span class="o">=</span><span class="n">deprecated</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">namespace</span><span class="p">,</span> <span class="n">values</span><span class="p">,</span> <span class="n">option_string</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">parser</span><span class="o">.</span><span class="n">print_help</span><span class="p">()</span>
<span class="n">parser</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
<span class="k">class</span><span class="w"> </span><span class="nc">_VersionAction</span><span class="p">(</span><span class="n">Action</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">option_strings</span><span class="p">,</span>
<span class="n">version</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">dest</span><span class="o">=</span><span class="n">SUPPRESS</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="n">SUPPRESS</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">deprecated</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="k">if</span> <span class="n">help</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">help</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;show program&#39;s version number and exit&quot;</span><span class="p">)</span>
<span class="nb">super</span><span class="p">(</span><span class="n">_VersionAction</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span>
<span class="n">option_strings</span><span class="o">=</span><span class="n">option_strings</span><span class="p">,</span>
<span class="n">dest</span><span class="o">=</span><span class="n">dest</span><span class="p">,</span>
<span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span>
<span class="n">nargs</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="n">help</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">version</span> <span class="o">=</span> <span class="n">version</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">namespace</span><span class="p">,</span> <span class="n">values</span><span class="p">,</span> <span class="n">option_string</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">version</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">version</span>
<span class="k">if</span> <span class="n">version</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">version</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">version</span>
<span class="n">formatter</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">_get_formatter</span><span class="p">()</span>
<span class="n">formatter</span><span class="o">.</span><span class="n">add_text</span><span class="p">(</span><span class="n">version</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">_print_message</span><span class="p">(</span><span class="n">formatter</span><span class="o">.</span><span class="n">format_help</span><span class="p">(),</span> <span class="n">_sys</span><span class="o">.</span><span class="n">stdout</span><span class="p">)</span>
<span class="n">parser</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
<span class="k">class</span><span class="w"> </span><span class="nc">_SubParsersAction</span><span class="p">(</span><span class="n">Action</span><span class="p">):</span>
<span class="k">class</span><span class="w"> </span><span class="nc">_ChoicesPseudoAction</span><span class="p">(</span><span class="n">Action</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">aliases</span><span class="p">,</span> <span class="n">help</span><span class="p">):</span>
<span class="n">metavar</span> <span class="o">=</span> <span class="n">dest</span> <span class="o">=</span> <span class="n">name</span>
<span class="k">if</span> <span class="n">aliases</span><span class="p">:</span>
<span class="n">metavar</span> <span class="o">+=</span> <span class="s1">&#39; (</span><span class="si">%s</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">aliases</span><span class="p">)</span>
<span class="n">sup</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">_SubParsersAction</span><span class="o">.</span><span class="n">_ChoicesPseudoAction</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span>
<span class="n">sup</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">option_strings</span><span class="o">=</span><span class="p">[],</span> <span class="n">dest</span><span class="o">=</span><span class="n">dest</span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="n">help</span><span class="p">,</span>
<span class="n">metavar</span><span class="o">=</span><span class="n">metavar</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">option_strings</span><span class="p">,</span>
<span class="n">prog</span><span class="p">,</span>
<span class="n">parser_class</span><span class="p">,</span>
<span class="n">dest</span><span class="o">=</span><span class="n">SUPPRESS</span><span class="p">,</span>
<span class="n">required</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">metavar</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_prog_prefix</span> <span class="o">=</span> <span class="n">prog</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_parser_class</span> <span class="o">=</span> <span class="n">parser_class</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_name_parser_map</span> <span class="o">=</span> <span class="p">{}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_choices_actions</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_deprecated</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="nb">super</span><span class="p">(</span><span class="n">_SubParsersAction</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span>
<span class="n">option_strings</span><span class="o">=</span><span class="n">option_strings</span><span class="p">,</span>
<span class="n">dest</span><span class="o">=</span><span class="n">dest</span><span class="p">,</span>
<span class="n">nargs</span><span class="o">=</span><span class="n">PARSER</span><span class="p">,</span>
<span class="n">choices</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">_name_parser_map</span><span class="p">,</span>
<span class="n">required</span><span class="o">=</span><span class="n">required</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="n">help</span><span class="p">,</span>
<span class="n">metavar</span><span class="o">=</span><span class="n">metavar</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">add_parser</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">deprecated</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="c1"># set prog from the existing prefix</span>
<span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;prog&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;prog&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1"> </span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_prog_prefix</span><span class="p">,</span> <span class="n">name</span><span class="p">)</span>
<span class="n">aliases</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">&#39;aliases&#39;</span><span class="p">,</span> <span class="p">())</span>
<span class="k">if</span> <span class="n">name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_name_parser_map</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ArgumentError</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;conflicting subparser: </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">)</span> <span class="o">%</span> <span class="n">name</span><span class="p">)</span>
<span class="k">for</span> <span class="n">alias</span> <span class="ow">in</span> <span class="n">aliases</span><span class="p">:</span>
<span class="k">if</span> <span class="n">alias</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_name_parser_map</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ArgumentError</span><span class="p">(</span>
<span class="bp">self</span><span class="p">,</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;conflicting subparser alias: </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">)</span> <span class="o">%</span> <span class="n">alias</span><span class="p">)</span>
<span class="c1"># create a pseudo-action to hold the choice help</span>
<span class="k">if</span> <span class="s1">&#39;help&#39;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="n">help</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">&#39;help&#39;</span><span class="p">)</span>
<span class="n">choice_action</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_ChoicesPseudoAction</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">aliases</span><span class="p">,</span> <span class="n">help</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_choices_actions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">choice_action</span><span class="p">)</span>
<span class="c1"># create the parser and add it to the map</span>
<span class="n">parser</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parser_class</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_name_parser_map</span><span class="p">[</span><span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">parser</span>
<span class="c1"># make parser available under aliases also</span>
<span class="k">for</span> <span class="n">alias</span> <span class="ow">in</span> <span class="n">aliases</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_name_parser_map</span><span class="p">[</span><span class="n">alias</span><span class="p">]</span> <span class="o">=</span> <span class="n">parser</span>
<span class="k">if</span> <span class="n">deprecated</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_deprecated</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">name</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_deprecated</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">aliases</span><span class="p">)</span>
<span class="k">return</span> <span class="n">parser</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_subactions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_choices_actions</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">namespace</span><span class="p">,</span> <span class="n">values</span><span class="p">,</span> <span class="n">option_string</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">parser_name</span> <span class="o">=</span> <span class="n">values</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">arg_strings</span> <span class="o">=</span> <span class="n">values</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
<span class="c1"># set the parser name if requested</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">dest</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">SUPPRESS</span><span class="p">:</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dest</span><span class="p">,</span> <span class="n">parser_name</span><span class="p">)</span>
<span class="c1"># select the parser</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">subparser</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_name_parser_map</span><span class="p">[</span><span class="n">parser_name</span><span class="p">]</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
<span class="n">args</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;parser_name&#39;</span><span class="p">:</span> <span class="n">parser_name</span><span class="p">,</span>
<span class="s1">&#39;choices&#39;</span><span class="p">:</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_name_parser_map</span><span class="p">)}</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;unknown parser </span><span class="si">%(parser_name)r</span><span class="s1"> (choices: </span><span class="si">%(choices)s</span><span class="s1">)&#39;</span><span class="p">)</span> <span class="o">%</span> <span class="n">args</span>
<span class="k">raise</span> <span class="n">ArgumentError</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
<span class="k">if</span> <span class="n">parser_name</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_deprecated</span><span class="p">:</span>
<span class="n">parser</span><span class="o">.</span><span class="n">_warning</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;command &#39;</span><span class="si">%(parser_name)s</span><span class="s2">&#39; is deprecated&quot;</span><span class="p">)</span> <span class="o">%</span>
<span class="p">{</span><span class="s1">&#39;parser_name&#39;</span><span class="p">:</span> <span class="n">parser_name</span><span class="p">})</span>
<span class="c1"># parse all the remaining options into the namespace</span>
<span class="c1"># store any unrecognized options on the object, so that the top</span>
<span class="c1"># level parser can decide what to do with them</span>
<span class="c1"># In case this subparser defines new defaults, we parse them</span>
<span class="c1"># in a new namespace object and then update the original</span>
<span class="c1"># namespace for the relevant parts.</span>
<span class="n">subnamespace</span><span class="p">,</span> <span class="n">arg_strings</span> <span class="o">=</span> <span class="n">subparser</span><span class="o">.</span><span class="n">parse_known_args</span><span class="p">(</span><span class="n">arg_strings</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">for</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="nb">vars</span><span class="p">(</span><span class="n">subnamespace</span><span class="p">)</span><span class="o">.</span><span class="n">items</span><span class="p">():</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">if</span> <span class="n">arg_strings</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="n">_UNRECOGNIZED_ARGS_ATTR</span><span class="p">):</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="n">_UNRECOGNIZED_ARGS_ATTR</span><span class="p">,</span> <span class="p">[])</span>
<span class="nb">getattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="n">_UNRECOGNIZED_ARGS_ATTR</span><span class="p">)</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">arg_strings</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">_ExtendAction</span><span class="p">(</span><span class="n">_AppendAction</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">parser</span><span class="p">,</span> <span class="n">namespace</span><span class="p">,</span> <span class="n">values</span><span class="p">,</span> <span class="n">option_string</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">items</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dest</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="n">items</span> <span class="o">=</span> <span class="n">_copy_items</span><span class="p">(</span><span class="n">items</span><span class="p">)</span>
<span class="n">items</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">values</span><span class="p">)</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">dest</span><span class="p">,</span> <span class="n">items</span><span class="p">)</span>
<span class="c1"># ==============</span>
<span class="c1"># Type classes</span>
<span class="c1"># ==============</span>
<span class="k">class</span><span class="w"> </span><span class="nc">FileType</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Factory for creating file object types</span>
<span class="sd"> Instances of FileType are typically passed as type= arguments to the</span>
<span class="sd"> ArgumentParser add_argument() method.</span>
<span class="sd"> Keyword Arguments:</span>
<span class="sd"> - mode -- A string indicating how the file is to be opened. Accepts the</span>
<span class="sd"> same values as the builtin open() function.</span>
<span class="sd"> - bufsize -- The file&#39;s desired buffer size. Accepts the same values as</span>
<span class="sd"> the builtin open() function.</span>
<span class="sd"> - encoding -- The file&#39;s encoding. Accepts the same values as the</span>
<span class="sd"> builtin open() function.</span>
<span class="sd"> - errors -- A string indicating how encoding and decoding errors are to</span>
<span class="sd"> be handled. Accepts the same value as the builtin open() function.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">mode</span><span class="o">=</span><span class="s1">&#39;r&#39;</span><span class="p">,</span> <span class="n">bufsize</span><span class="o">=-</span><span class="mi">1</span><span class="p">,</span> <span class="n">encoding</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_mode</span> <span class="o">=</span> <span class="n">mode</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_bufsize</span> <span class="o">=</span> <span class="n">bufsize</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_encoding</span> <span class="o">=</span> <span class="n">encoding</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_errors</span> <span class="o">=</span> <span class="n">errors</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__call__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">string</span><span class="p">):</span>
<span class="c1"># the special argument &quot;-&quot; means sys.std{in,out}</span>
<span class="k">if</span> <span class="n">string</span> <span class="o">==</span> <span class="s1">&#39;-&#39;</span><span class="p">:</span>
<span class="k">if</span> <span class="s1">&#39;r&#39;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mode</span><span class="p">:</span>
<span class="k">return</span> <span class="n">_sys</span><span class="o">.</span><span class="n">stdin</span><span class="o">.</span><span class="n">buffer</span> <span class="k">if</span> <span class="s1">&#39;b&#39;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mode</span> <span class="k">else</span> <span class="n">_sys</span><span class="o">.</span><span class="n">stdin</span>
<span class="k">elif</span> <span class="nb">any</span><span class="p">(</span><span class="n">c</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mode</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="s1">&#39;wax&#39;</span><span class="p">):</span>
<span class="k">return</span> <span class="n">_sys</span><span class="o">.</span><span class="n">stdout</span><span class="o">.</span><span class="n">buffer</span> <span class="k">if</span> <span class="s1">&#39;b&#39;</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mode</span> <span class="k">else</span> <span class="n">_sys</span><span class="o">.</span><span class="n">stdout</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;argument &quot;-&quot; with mode </span><span class="si">%r</span><span class="s1">&#39;</span><span class="p">)</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mode</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="c1"># all other arguments are used as file names</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">open</span><span class="p">(</span><span class="n">string</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_bufsize</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_encoding</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_errors</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
<span class="n">args</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;filename&#39;</span><span class="p">:</span> <span class="n">string</span><span class="p">,</span> <span class="s1">&#39;error&#39;</span><span class="p">:</span> <span class="n">e</span><span class="p">}</span>
<span class="n">message</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;can&#39;t open &#39;</span><span class="si">%(filename)s</span><span class="s2">&#39;: </span><span class="si">%(error)s</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">ArgumentTypeError</span><span class="p">(</span><span class="n">message</span> <span class="o">%</span> <span class="n">args</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">args</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mode</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_bufsize</span>
<span class="n">kwargs</span> <span class="o">=</span> <span class="p">[(</span><span class="s1">&#39;encoding&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_encoding</span><span class="p">),</span> <span class="p">(</span><span class="s1">&#39;errors&#39;</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_errors</span><span class="p">)]</span>
<span class="n">args_str</span> <span class="o">=</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="nb">repr</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span> <span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">args</span> <span class="k">if</span> <span class="n">arg</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span>
<span class="p">[</span><span class="s1">&#39;</span><span class="si">%s</span><span class="s1">=</span><span class="si">%r</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">kw</span><span class="p">,</span> <span class="n">arg</span><span class="p">)</span> <span class="k">for</span> <span class="n">kw</span><span class="p">,</span> <span class="n">arg</span> <span class="ow">in</span> <span class="n">kwargs</span>
<span class="k">if</span> <span class="n">arg</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">])</span>
<span class="k">return</span> <span class="s1">&#39;</span><span class="si">%s</span><span class="s1">(</span><span class="si">%s</span><span class="s1">)&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="p">,</span> <span class="n">args_str</span><span class="p">)</span>
<span class="c1"># ===========================</span>
<span class="c1"># Optional and Positional Parsing</span>
<span class="c1"># ===========================</span>
<span class="k">class</span><span class="w"> </span><span class="nc">Namespace</span><span class="p">(</span><span class="n">_AttributeHolder</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Simple object for storing attributes.</span>
<span class="sd"> Implements equality by attribute names and values, and provides a simple</span>
<span class="sd"> string representation.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="nb">setattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">[</span><span class="n">name</span><span class="p">])</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">Namespace</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">NotImplemented</span>
<span class="k">return</span> <span class="nb">vars</span><span class="p">(</span><span class="bp">self</span><span class="p">)</span> <span class="o">==</span> <span class="nb">vars</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__contains__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">key</span><span class="p">):</span>
<span class="k">return</span> <span class="n">key</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span>
<span class="k">class</span><span class="w"> </span><span class="nc">_ActionsContainer</span><span class="p">(</span><span class="nb">object</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">description</span><span class="p">,</span>
<span class="n">prefix_chars</span><span class="p">,</span>
<span class="n">argument_default</span><span class="p">,</span>
<span class="n">conflict_handler</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">_ActionsContainer</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">()</span>
<span class="bp">self</span><span class="o">.</span><span class="n">description</span> <span class="o">=</span> <span class="n">description</span>
<span class="bp">self</span><span class="o">.</span><span class="n">argument_default</span> <span class="o">=</span> <span class="n">argument_default</span>
<span class="bp">self</span><span class="o">.</span><span class="n">prefix_chars</span> <span class="o">=</span> <span class="n">prefix_chars</span>
<span class="bp">self</span><span class="o">.</span><span class="n">conflict_handler</span> <span class="o">=</span> <span class="n">conflict_handler</span>
<span class="c1"># set up registries</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_registries</span> <span class="o">=</span> <span class="p">{}</span>
<span class="c1"># register actions</span>
<span class="bp">self</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="s1">&#39;action&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">_StoreAction</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="s1">&#39;action&#39;</span><span class="p">,</span> <span class="s1">&#39;store&#39;</span><span class="p">,</span> <span class="n">_StoreAction</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="s1">&#39;action&#39;</span><span class="p">,</span> <span class="s1">&#39;store_const&#39;</span><span class="p">,</span> <span class="n">_StoreConstAction</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="s1">&#39;action&#39;</span><span class="p">,</span> <span class="s1">&#39;store_true&#39;</span><span class="p">,</span> <span class="n">_StoreTrueAction</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="s1">&#39;action&#39;</span><span class="p">,</span> <span class="s1">&#39;store_false&#39;</span><span class="p">,</span> <span class="n">_StoreFalseAction</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="s1">&#39;action&#39;</span><span class="p">,</span> <span class="s1">&#39;append&#39;</span><span class="p">,</span> <span class="n">_AppendAction</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="s1">&#39;action&#39;</span><span class="p">,</span> <span class="s1">&#39;append_const&#39;</span><span class="p">,</span> <span class="n">_AppendConstAction</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="s1">&#39;action&#39;</span><span class="p">,</span> <span class="s1">&#39;count&#39;</span><span class="p">,</span> <span class="n">_CountAction</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="s1">&#39;action&#39;</span><span class="p">,</span> <span class="s1">&#39;help&#39;</span><span class="p">,</span> <span class="n">_HelpAction</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="s1">&#39;action&#39;</span><span class="p">,</span> <span class="s1">&#39;version&#39;</span><span class="p">,</span> <span class="n">_VersionAction</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="s1">&#39;action&#39;</span><span class="p">,</span> <span class="s1">&#39;parsers&#39;</span><span class="p">,</span> <span class="n">_SubParsersAction</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="s1">&#39;action&#39;</span><span class="p">,</span> <span class="s1">&#39;extend&#39;</span><span class="p">,</span> <span class="n">_ExtendAction</span><span class="p">)</span>
<span class="c1"># raise an exception if the conflict handler is invalid</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_get_handler</span><span class="p">()</span>
<span class="c1"># action storage</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_actions</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_option_string_actions</span> <span class="o">=</span> <span class="p">{}</span>
<span class="c1"># groups</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_action_groups</span> <span class="o">=</span> <span class="p">[]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_mutually_exclusive_groups</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c1"># defaults storage</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_defaults</span> <span class="o">=</span> <span class="p">{}</span>
<span class="c1"># determines whether an &quot;option&quot; looks like a negative number</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_negative_number_matcher</span> <span class="o">=</span> <span class="n">_re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="sa">r</span><span class="s1">&#39;^-\d+$|^-\d*\.\d+$&#39;</span><span class="p">)</span>
<span class="c1"># whether or not there are any optionals that look like negative</span>
<span class="c1"># numbers -- uses a list so it can be shared and edited</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_has_negative_number_optionals</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c1"># ====================</span>
<span class="c1"># Registration methods</span>
<span class="c1"># ====================</span>
<span class="k">def</span><span class="w"> </span><span class="nf">register</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">registry_name</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="nb">object</span><span class="p">):</span>
<span class="n">registry</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registries</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">registry_name</span><span class="p">,</span> <span class="p">{})</span>
<span class="n">registry</span><span class="p">[</span><span class="n">value</span><span class="p">]</span> <span class="o">=</span> <span class="nb">object</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_registry_get</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">registry_name</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registries</span><span class="p">[</span><span class="n">registry_name</span><span class="p">]</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">default</span><span class="p">)</span>
<span class="c1"># ==================================</span>
<span class="c1"># Namespace default accessor methods</span>
<span class="c1"># ==================================</span>
<span class="k">def</span><span class="w"> </span><span class="nf">set_defaults</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_defaults</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span>
<span class="c1"># if these defaults match any existing arguments, replace</span>
<span class="c1"># the previous default on the object with the new one</span>
<span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span><span class="p">:</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">dest</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="n">action</span><span class="o">.</span><span class="n">default</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="n">action</span><span class="o">.</span><span class="n">dest</span><span class="p">]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">get_default</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dest</span><span class="p">):</span>
<span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span><span class="p">:</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">dest</span> <span class="o">==</span> <span class="n">dest</span> <span class="ow">and</span> <span class="n">action</span><span class="o">.</span><span class="n">default</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">return</span> <span class="n">action</span><span class="o">.</span><span class="n">default</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_defaults</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">dest</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="c1"># =======================</span>
<span class="c1"># Adding argument actions</span>
<span class="c1"># =======================</span>
<span class="k">def</span><span class="w"> </span><span class="nf">add_argument</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;</span>
<span class="sd"> add_argument(dest, ..., name=value, ...)</span>
<span class="sd"> add_argument(option_string, option_string, ..., name=value, ...)</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="c1"># if no positional args are supplied or only one is supplied and</span>
<span class="c1"># it doesn&#39;t look like an option string, parse a positional</span>
<span class="c1"># argument</span>
<span class="n">chars</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">prefix_chars</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">args</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">args</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">chars</span><span class="p">:</span>
<span class="k">if</span> <span class="n">args</span> <span class="ow">and</span> <span class="s1">&#39;dest&#39;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;dest supplied twice for positional argument&#39;</span><span class="p">)</span>
<span class="n">kwargs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_positional_kwargs</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="c1"># otherwise, we&#39;re adding an optional argument</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">kwargs</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_optional_kwargs</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="c1"># if no default was supplied, use the parser-level default</span>
<span class="k">if</span> <span class="s1">&#39;default&#39;</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="n">dest</span> <span class="o">=</span> <span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;dest&#39;</span><span class="p">]</span>
<span class="k">if</span> <span class="n">dest</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_defaults</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;default&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_defaults</span><span class="p">[</span><span class="n">dest</span><span class="p">]</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">argument_default</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;default&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">argument_default</span>
<span class="c1"># create the action object, and add it to the parser</span>
<span class="n">action_class</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pop_action_class</span><span class="p">(</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">callable</span><span class="p">(</span><span class="n">action_class</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;unknown action &quot;</span><span class="si">%s</span><span class="s1">&quot;&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">action_class</span><span class="p">,))</span>
<span class="n">action</span> <span class="o">=</span> <span class="n">action_class</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="c1"># raise an error if the action type is not callable</span>
<span class="n">type_func</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registry_get</span><span class="p">(</span><span class="s1">&#39;type&#39;</span><span class="p">,</span> <span class="n">action</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="n">action</span><span class="o">.</span><span class="n">type</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">callable</span><span class="p">(</span><span class="n">type_func</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%r</span><span class="s1"> is not callable&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">type_func</span><span class="p">,))</span>
<span class="k">if</span> <span class="n">type_func</span> <span class="ow">is</span> <span class="n">FileType</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%r</span><span class="s1"> is a FileType class object, instance of it&#39;</span>
<span class="s1">&#39; must be passed&#39;</span> <span class="o">%</span> <span class="p">(</span><span class="n">type_func</span><span class="p">,))</span>
<span class="c1"># raise an error if the metavar does not match the type</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="s2">&quot;_get_formatter&quot;</span><span class="p">):</span>
<span class="k">try</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_get_formatter</span><span class="p">()</span><span class="o">.</span><span class="n">_format_args</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">&quot;length of metavar tuple does not match nargs&quot;</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_add_action</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">add_argument_group</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">group</span> <span class="o">=</span> <span class="n">_ArgumentGroup</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_action_groups</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">group</span><span class="p">)</span>
<span class="k">return</span> <span class="n">group</span>
<span class="k">def</span><span class="w"> </span><span class="nf">add_mutually_exclusive_group</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="n">group</span> <span class="o">=</span> <span class="n">_MutuallyExclusiveGroup</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_mutually_exclusive_groups</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">group</span><span class="p">)</span>
<span class="k">return</span> <span class="n">group</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_add_action</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
<span class="c1"># resolve any conflicts</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check_conflict</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="c1"># add to actions list</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_actions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="n">action</span><span class="o">.</span><span class="n">container</span> <span class="o">=</span> <span class="bp">self</span>
<span class="c1"># index the action by any option strings it has</span>
<span class="k">for</span> <span class="n">option_string</span> <span class="ow">in</span> <span class="n">action</span><span class="o">.</span><span class="n">option_strings</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_option_string_actions</span><span class="p">[</span><span class="n">option_string</span><span class="p">]</span> <span class="o">=</span> <span class="n">action</span>
<span class="c1"># set the flag if any option strings look like negative numbers</span>
<span class="k">for</span> <span class="n">option_string</span> <span class="ow">in</span> <span class="n">action</span><span class="o">.</span><span class="n">option_strings</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_negative_number_matcher</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">option_string</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_has_negative_number_optionals</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_has_negative_number_optionals</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
<span class="c1"># return the created action</span>
<span class="k">return</span> <span class="n">action</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_remove_action</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_actions</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_add_container_actions</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">container</span><span class="p">):</span>
<span class="c1"># collect groups by titles</span>
<span class="n">title_group_map</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">group</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_action_groups</span><span class="p">:</span>
<span class="k">if</span> <span class="n">group</span><span class="o">.</span><span class="n">title</span> <span class="ow">in</span> <span class="n">title_group_map</span><span class="p">:</span>
<span class="c1"># This branch could happen if a derived class added</span>
<span class="c1"># groups with duplicated titles in __init__</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;cannot merge actions - two groups are named </span><span class="si">%r</span><span class="s1">&#39;</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span> <span class="o">%</span> <span class="p">(</span><span class="n">group</span><span class="o">.</span><span class="n">title</span><span class="p">))</span>
<span class="n">title_group_map</span><span class="p">[</span><span class="n">group</span><span class="o">.</span><span class="n">title</span><span class="p">]</span> <span class="o">=</span> <span class="n">group</span>
<span class="c1"># map each action to its group</span>
<span class="n">group_map</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">group</span> <span class="ow">in</span> <span class="n">container</span><span class="o">.</span><span class="n">_action_groups</span><span class="p">:</span>
<span class="c1"># if a group with the title exists, use that, otherwise</span>
<span class="c1"># create a new group matching the container&#39;s group</span>
<span class="k">if</span> <span class="n">group</span><span class="o">.</span><span class="n">title</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">title_group_map</span><span class="p">:</span>
<span class="n">title_group_map</span><span class="p">[</span><span class="n">group</span><span class="o">.</span><span class="n">title</span><span class="p">]</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">add_argument_group</span><span class="p">(</span>
<span class="n">title</span><span class="o">=</span><span class="n">group</span><span class="o">.</span><span class="n">title</span><span class="p">,</span>
<span class="n">description</span><span class="o">=</span><span class="n">group</span><span class="o">.</span><span class="n">description</span><span class="p">,</span>
<span class="n">conflict_handler</span><span class="o">=</span><span class="n">group</span><span class="o">.</span><span class="n">conflict_handler</span><span class="p">)</span>
<span class="c1"># map the actions to their new group</span>
<span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="n">group</span><span class="o">.</span><span class="n">_group_actions</span><span class="p">:</span>
<span class="n">group_map</span><span class="p">[</span><span class="n">action</span><span class="p">]</span> <span class="o">=</span> <span class="n">title_group_map</span><span class="p">[</span><span class="n">group</span><span class="o">.</span><span class="n">title</span><span class="p">]</span>
<span class="c1"># add container&#39;s mutually exclusive groups</span>
<span class="c1"># NOTE: if add_mutually_exclusive_group ever gains title= and</span>
<span class="c1"># description= then this code will need to be expanded as above</span>
<span class="k">for</span> <span class="n">group</span> <span class="ow">in</span> <span class="n">container</span><span class="o">.</span><span class="n">_mutually_exclusive_groups</span><span class="p">:</span>
<span class="k">if</span> <span class="n">group</span><span class="o">.</span><span class="n">_container</span> <span class="ow">is</span> <span class="n">container</span><span class="p">:</span>
<span class="n">cont</span> <span class="o">=</span> <span class="bp">self</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">cont</span> <span class="o">=</span> <span class="n">title_group_map</span><span class="p">[</span><span class="n">group</span><span class="o">.</span><span class="n">_container</span><span class="o">.</span><span class="n">title</span><span class="p">]</span>
<span class="n">mutex_group</span> <span class="o">=</span> <span class="n">cont</span><span class="o">.</span><span class="n">add_mutually_exclusive_group</span><span class="p">(</span>
<span class="n">required</span><span class="o">=</span><span class="n">group</span><span class="o">.</span><span class="n">required</span><span class="p">)</span>
<span class="c1"># map the actions to their new mutex group</span>
<span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="n">group</span><span class="o">.</span><span class="n">_group_actions</span><span class="p">:</span>
<span class="n">group_map</span><span class="p">[</span><span class="n">action</span><span class="p">]</span> <span class="o">=</span> <span class="n">mutex_group</span>
<span class="c1"># add all actions to this container or their group</span>
<span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="n">container</span><span class="o">.</span><span class="n">_actions</span><span class="p">:</span>
<span class="n">group_map</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">_add_action</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_positional_kwargs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">dest</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="c1"># make sure required is not specified</span>
<span class="k">if</span> <span class="s1">&#39;required&#39;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s2">&quot;&#39;required&#39; is an invalid argument for positionals&quot;</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="c1"># mark positional arguments as required if at least one is</span>
<span class="c1"># always required</span>
<span class="n">nargs</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;nargs&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nargs</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="n">OPTIONAL</span><span class="p">,</span> <span class="n">ZERO_OR_MORE</span><span class="p">,</span> <span class="n">REMAINDER</span><span class="p">,</span> <span class="n">SUPPRESS</span><span class="p">,</span> <span class="mi">0</span><span class="p">]:</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;required&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="kc">True</span>
<span class="c1"># return the keyword arguments with no option strings</span>
<span class="k">return</span> <span class="nb">dict</span><span class="p">(</span><span class="n">kwargs</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="n">dest</span><span class="p">,</span> <span class="n">option_strings</span><span class="o">=</span><span class="p">[])</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_optional_kwargs</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="c1"># determine short and long option strings</span>
<span class="n">option_strings</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">long_option_strings</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">option_string</span> <span class="ow">in</span> <span class="n">args</span><span class="p">:</span>
<span class="c1"># error on strings that don&#39;t start with an appropriate prefix</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">option_string</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">prefix_chars</span><span class="p">:</span>
<span class="n">args</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;option&#39;</span><span class="p">:</span> <span class="n">option_string</span><span class="p">,</span>
<span class="s1">&#39;prefix_chars&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">prefix_chars</span><span class="p">}</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;invalid option string </span><span class="si">%(option)r</span><span class="s1">: &#39;</span>
<span class="s1">&#39;must start with a character </span><span class="si">%(prefix_chars)r</span><span class="s1">&#39;</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span> <span class="o">%</span> <span class="n">args</span><span class="p">)</span>
<span class="c1"># strings starting with two prefix characters are long options</span>
<span class="n">option_strings</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">option_string</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">option_string</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">option_string</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">prefix_chars</span><span class="p">:</span>
<span class="n">long_option_strings</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">option_string</span><span class="p">)</span>
<span class="c1"># infer destination, &#39;--foo-bar&#39; -&gt; &#39;foo_bar&#39; and &#39;-x&#39; -&gt; &#39;x&#39;</span>
<span class="n">dest</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">&#39;dest&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="k">if</span> <span class="n">dest</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="n">long_option_strings</span><span class="p">:</span>
<span class="n">dest_option_string</span> <span class="o">=</span> <span class="n">long_option_strings</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">dest_option_string</span> <span class="o">=</span> <span class="n">option_strings</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">dest</span> <span class="o">=</span> <span class="n">dest_option_string</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">prefix_chars</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">dest</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;dest= is required for options like </span><span class="si">%r</span><span class="s1">&#39;</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span> <span class="o">%</span> <span class="n">option_string</span><span class="p">)</span>
<span class="n">dest</span> <span class="o">=</span> <span class="n">dest</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="s1">&#39;_&#39;</span><span class="p">)</span>
<span class="c1"># return the updated keyword arguments</span>
<span class="k">return</span> <span class="nb">dict</span><span class="p">(</span><span class="n">kwargs</span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="n">dest</span><span class="p">,</span> <span class="n">option_strings</span><span class="o">=</span><span class="n">option_strings</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_pop_action_class</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">kwargs</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">action</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">&#39;action&#39;</span><span class="p">,</span> <span class="n">default</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registry_get</span><span class="p">(</span><span class="s1">&#39;action&#39;</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="n">action</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_handler</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="c1"># determine function from conflict handler string</span>
<span class="n">handler_func_name</span> <span class="o">=</span> <span class="s1">&#39;_handle_conflict_</span><span class="si">%s</span><span class="s1">&#39;</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">conflict_handler</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">return</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">handler_func_name</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">AttributeError</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;invalid conflict_resolution value: </span><span class="si">%r</span><span class="s1">&#39;</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">conflict_handler</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_conflict</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
<span class="c1"># find all options that conflict with this option</span>
<span class="n">confl_optionals</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">option_string</span> <span class="ow">in</span> <span class="n">action</span><span class="o">.</span><span class="n">option_strings</span><span class="p">:</span>
<span class="k">if</span> <span class="n">option_string</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_option_string_actions</span><span class="p">:</span>
<span class="n">confl_optional</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_option_string_actions</span><span class="p">[</span><span class="n">option_string</span><span class="p">]</span>
<span class="n">confl_optionals</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">option_string</span><span class="p">,</span> <span class="n">confl_optional</span><span class="p">))</span>
<span class="c1"># resolve any conflicts</span>
<span class="k">if</span> <span class="n">confl_optionals</span><span class="p">:</span>
<span class="n">conflict_handler</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_handler</span><span class="p">()</span>
<span class="n">conflict_handler</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">confl_optionals</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_handle_conflict_error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="n">conflicting_actions</span><span class="p">):</span>
<span class="n">message</span> <span class="o">=</span> <span class="n">ngettext</span><span class="p">(</span><span class="s1">&#39;conflicting option string: </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span>
<span class="s1">&#39;conflicting option strings: </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">,</span>
<span class="nb">len</span><span class="p">(</span><span class="n">conflicting_actions</span><span class="p">))</span>
<span class="n">conflict_string</span> <span class="o">=</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">option_string</span>
<span class="k">for</span> <span class="n">option_string</span><span class="p">,</span> <span class="n">action</span>
<span class="ow">in</span> <span class="n">conflicting_actions</span><span class="p">])</span>
<span class="k">raise</span> <span class="n">ArgumentError</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">message</span> <span class="o">%</span> <span class="n">conflict_string</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_handle_conflict_resolve</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="n">conflicting_actions</span><span class="p">):</span>
<span class="c1"># remove all conflicting options</span>
<span class="k">for</span> <span class="n">option_string</span><span class="p">,</span> <span class="n">action</span> <span class="ow">in</span> <span class="n">conflicting_actions</span><span class="p">:</span>
<span class="c1"># remove the conflicting option</span>
<span class="n">action</span><span class="o">.</span><span class="n">option_strings</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">option_string</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_option_string_actions</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="n">option_string</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="c1"># if the option now has no option string, remove it from the</span>
<span class="c1"># container holding it</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">action</span><span class="o">.</span><span class="n">option_strings</span><span class="p">:</span>
<span class="n">action</span><span class="o">.</span><span class="n">container</span><span class="o">.</span><span class="n">_remove_action</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">_ArgumentGroup</span><span class="p">(</span><span class="n">_ActionsContainer</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">container</span><span class="p">,</span> <span class="n">title</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">description</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="c1"># add any missing keyword arguments by checking the container</span>
<span class="n">update</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span>
<span class="n">update</span><span class="p">(</span><span class="s1">&#39;conflict_handler&#39;</span><span class="p">,</span> <span class="n">container</span><span class="o">.</span><span class="n">conflict_handler</span><span class="p">)</span>
<span class="n">update</span><span class="p">(</span><span class="s1">&#39;prefix_chars&#39;</span><span class="p">,</span> <span class="n">container</span><span class="o">.</span><span class="n">prefix_chars</span><span class="p">)</span>
<span class="n">update</span><span class="p">(</span><span class="s1">&#39;argument_default&#39;</span><span class="p">,</span> <span class="n">container</span><span class="o">.</span><span class="n">argument_default</span><span class="p">)</span>
<span class="n">super_init</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">_ArgumentGroup</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span>
<span class="n">super_init</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="n">description</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="c1"># group attributes</span>
<span class="bp">self</span><span class="o">.</span><span class="n">title</span> <span class="o">=</span> <span class="n">title</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_group_actions</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c1"># share most attributes with the container</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_registries</span> <span class="o">=</span> <span class="n">container</span><span class="o">.</span><span class="n">_registries</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_actions</span> <span class="o">=</span> <span class="n">container</span><span class="o">.</span><span class="n">_actions</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_option_string_actions</span> <span class="o">=</span> <span class="n">container</span><span class="o">.</span><span class="n">_option_string_actions</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_defaults</span> <span class="o">=</span> <span class="n">container</span><span class="o">.</span><span class="n">_defaults</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_has_negative_number_optionals</span> <span class="o">=</span> \
<span class="n">container</span><span class="o">.</span><span class="n">_has_negative_number_optionals</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_mutually_exclusive_groups</span> <span class="o">=</span> <span class="n">container</span><span class="o">.</span><span class="n">_mutually_exclusive_groups</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_add_action</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
<span class="n">action</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">_ArgumentGroup</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">_add_action</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_group_actions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="k">return</span> <span class="n">action</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_remove_action</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">_ArgumentGroup</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="n">_remove_action</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_group_actions</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">add_argument_group</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">warnings</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
<span class="s2">&quot;Nesting argument groups is deprecated.&quot;</span><span class="p">,</span>
<span class="n">category</span><span class="o">=</span><span class="ne">DeprecationWarning</span><span class="p">,</span>
<span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span>
<span class="p">)</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">add_argument_group</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="k">class</span><span class="w"> </span><span class="nc">_MutuallyExclusiveGroup</span><span class="p">(</span><span class="n">_ArgumentGroup</span><span class="p">):</span>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">container</span><span class="p">,</span> <span class="n">required</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
<span class="nb">super</span><span class="p">(</span><span class="n">_MutuallyExclusiveGroup</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span><span class="p">(</span><span class="n">container</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">required</span> <span class="o">=</span> <span class="n">required</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_container</span> <span class="o">=</span> <span class="n">container</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_add_action</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">required</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;mutually exclusive arguments must be optional&#39;</span><span class="p">)</span>
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="n">action</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_container</span><span class="o">.</span><span class="n">_add_action</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_group_actions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="k">return</span> <span class="n">action</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_remove_action</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_container</span><span class="o">.</span><span class="n">_remove_action</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_group_actions</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="k">def</span><span class="w"> </span><span class="nf">add_mutually_exclusive_group</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="kn">import</span><span class="w"> </span><span class="nn">warnings</span>
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span>
<span class="s2">&quot;Nesting mutually exclusive groups is deprecated.&quot;</span><span class="p">,</span>
<span class="n">category</span><span class="o">=</span><span class="ne">DeprecationWarning</span><span class="p">,</span>
<span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span>
<span class="p">)</span>
<span class="k">return</span> <span class="nb">super</span><span class="p">()</span><span class="o">.</span><span class="n">add_mutually_exclusive_group</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<div class="viewcode-block" id="ArgumentParser">
<a class="viewcode-back" href="../api/evennia.server.profiling.dummyrunner.html#evennia.server.evennia_launcher.ArgumentParser">[docs]</a>
<span class="k">class</span><span class="w"> </span><span class="nc">ArgumentParser</span><span class="p">(</span><span class="n">_AttributeHolder</span><span class="p">,</span> <span class="n">_ActionsContainer</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;Object for parsing command line strings into Python objects.</span>
<span class="sd"> Keyword Arguments:</span>
<span class="sd"> - prog -- The name of the program (default:</span>
<span class="sd"> ``os.path.basename(sys.argv[0])``)</span>
<span class="sd"> - usage -- A usage message (default: auto-generated from arguments)</span>
<span class="sd"> - description -- A description of what the program does</span>
<span class="sd"> - epilog -- Text following the argument descriptions</span>
<span class="sd"> - parents -- Parsers whose arguments should be copied into this one</span>
<span class="sd"> - formatter_class -- HelpFormatter class for printing help messages</span>
<span class="sd"> - prefix_chars -- Characters that prefix optional arguments</span>
<span class="sd"> - fromfile_prefix_chars -- Characters that prefix files containing</span>
<span class="sd"> additional arguments</span>
<span class="sd"> - argument_default -- The default value for all arguments</span>
<span class="sd"> - conflict_handler -- String indicating how to handle conflicts</span>
<span class="sd"> - add_help -- Add a -h/-help option</span>
<span class="sd"> - allow_abbrev -- Allow long options to be abbreviated unambiguously</span>
<span class="sd"> - exit_on_error -- Determines whether or not ArgumentParser exits with</span>
<span class="sd"> error info when an error occurs</span>
<span class="sd"> &quot;&quot;&quot;</span>
<div class="viewcode-block" id="ArgumentParser.__init__">
<a class="viewcode-back" href="../api/evennia.server.profiling.dummyrunner.html#evennia.server.evennia_launcher.ArgumentParser.__init__">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span>
<span class="n">prog</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">usage</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">description</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">epilog</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">parents</span><span class="o">=</span><span class="p">[],</span>
<span class="n">formatter_class</span><span class="o">=</span><span class="n">HelpFormatter</span><span class="p">,</span>
<span class="n">prefix_chars</span><span class="o">=</span><span class="s1">&#39;-&#39;</span><span class="p">,</span>
<span class="n">fromfile_prefix_chars</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">argument_default</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
<span class="n">conflict_handler</span><span class="o">=</span><span class="s1">&#39;error&#39;</span><span class="p">,</span>
<span class="n">add_help</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">allow_abbrev</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
<span class="n">exit_on_error</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
<span class="n">superinit</span> <span class="o">=</span> <span class="nb">super</span><span class="p">(</span><span class="n">ArgumentParser</span><span class="p">,</span> <span class="bp">self</span><span class="p">)</span><span class="o">.</span><span class="fm">__init__</span>
<span class="n">superinit</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="n">description</span><span class="p">,</span>
<span class="n">prefix_chars</span><span class="o">=</span><span class="n">prefix_chars</span><span class="p">,</span>
<span class="n">argument_default</span><span class="o">=</span><span class="n">argument_default</span><span class="p">,</span>
<span class="n">conflict_handler</span><span class="o">=</span><span class="n">conflict_handler</span><span class="p">)</span>
<span class="c1"># default setting for prog</span>
<span class="k">if</span> <span class="n">prog</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">prog</span> <span class="o">=</span> <span class="n">_os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">basename</span><span class="p">(</span><span class="n">_sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="bp">self</span><span class="o">.</span><span class="n">prog</span> <span class="o">=</span> <span class="n">prog</span>
<span class="bp">self</span><span class="o">.</span><span class="n">usage</span> <span class="o">=</span> <span class="n">usage</span>
<span class="bp">self</span><span class="o">.</span><span class="n">epilog</span> <span class="o">=</span> <span class="n">epilog</span>
<span class="bp">self</span><span class="o">.</span><span class="n">formatter_class</span> <span class="o">=</span> <span class="n">formatter_class</span>
<span class="bp">self</span><span class="o">.</span><span class="n">fromfile_prefix_chars</span> <span class="o">=</span> <span class="n">fromfile_prefix_chars</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add_help</span> <span class="o">=</span> <span class="n">add_help</span>
<span class="bp">self</span><span class="o">.</span><span class="n">allow_abbrev</span> <span class="o">=</span> <span class="n">allow_abbrev</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exit_on_error</span> <span class="o">=</span> <span class="n">exit_on_error</span>
<span class="n">add_group</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">add_argument_group</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_positionals</span> <span class="o">=</span> <span class="n">add_group</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s1">&#39;positional arguments&#39;</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_optionals</span> <span class="o">=</span> <span class="n">add_group</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s1">&#39;options&#39;</span><span class="p">))</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_subparsers</span> <span class="o">=</span> <span class="kc">None</span>
<span class="c1"># register types</span>
<span class="k">def</span><span class="w"> </span><span class="nf">identity</span><span class="p">(</span><span class="n">string</span><span class="p">):</span>
<span class="k">return</span> <span class="n">string</span>
<span class="bp">self</span><span class="o">.</span><span class="n">register</span><span class="p">(</span><span class="s1">&#39;type&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">identity</span><span class="p">)</span>
<span class="c1"># add help argument if necessary</span>
<span class="c1"># (using explicit default to override global argument_default)</span>
<span class="n">default_prefix</span> <span class="o">=</span> <span class="s1">&#39;-&#39;</span> <span class="k">if</span> <span class="s1">&#39;-&#39;</span> <span class="ow">in</span> <span class="n">prefix_chars</span> <span class="k">else</span> <span class="n">prefix_chars</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">add_help</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span>
<span class="n">default_prefix</span><span class="o">+</span><span class="s1">&#39;h&#39;</span><span class="p">,</span> <span class="n">default_prefix</span><span class="o">*</span><span class="mi">2</span><span class="o">+</span><span class="s1">&#39;help&#39;</span><span class="p">,</span>
<span class="n">action</span><span class="o">=</span><span class="s1">&#39;help&#39;</span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="n">SUPPRESS</span><span class="p">,</span>
<span class="n">help</span><span class="o">=</span><span class="n">_</span><span class="p">(</span><span class="s1">&#39;show this help message and exit&#39;</span><span class="p">))</span>
<span class="c1"># add parent arguments and defaults</span>
<span class="k">for</span> <span class="n">parent</span> <span class="ow">in</span> <span class="n">parents</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">parent</span><span class="p">,</span> <span class="n">ArgumentParser</span><span class="p">):</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;parents must be a list of ArgumentParser&#39;</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_add_container_actions</span><span class="p">(</span><span class="n">parent</span><span class="p">)</span>
<span class="n">defaults</span> <span class="o">=</span> <span class="n">parent</span><span class="o">.</span><span class="n">_defaults</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_defaults</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">defaults</span><span class="p">)</span></div>
<span class="c1"># =======================</span>
<span class="c1"># Pretty __repr__ methods</span>
<span class="c1"># =======================</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_kwargs</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">names</span> <span class="o">=</span> <span class="p">[</span>
<span class="s1">&#39;prog&#39;</span><span class="p">,</span>
<span class="s1">&#39;usage&#39;</span><span class="p">,</span>
<span class="s1">&#39;description&#39;</span><span class="p">,</span>
<span class="s1">&#39;formatter_class&#39;</span><span class="p">,</span>
<span class="s1">&#39;conflict_handler&#39;</span><span class="p">,</span>
<span class="s1">&#39;add_help&#39;</span><span class="p">,</span>
<span class="p">]</span>
<span class="k">return</span> <span class="p">[(</span><span class="n">name</span><span class="p">,</span> <span class="nb">getattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">name</span><span class="p">))</span> <span class="k">for</span> <span class="n">name</span> <span class="ow">in</span> <span class="n">names</span><span class="p">]</span>
<span class="c1"># ==================================</span>
<span class="c1"># Optional/Positional adding methods</span>
<span class="c1"># ==================================</span>
<div class="viewcode-block" id="ArgumentParser.add_subparsers">
<a class="viewcode-back" href="../api/evennia.server.profiling.dummyrunner.html#evennia.server.evennia_launcher.ArgumentParser.add_subparsers">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">add_subparsers</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_subparsers</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ArgumentError</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;cannot have multiple subparser arguments&#39;</span><span class="p">))</span>
<span class="c1"># add the parser class to the arguments if it&#39;s not present</span>
<span class="n">kwargs</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="s1">&#39;parser_class&#39;</span><span class="p">,</span> <span class="nb">type</span><span class="p">(</span><span class="bp">self</span><span class="p">))</span>
<span class="k">if</span> <span class="s1">&#39;title&#39;</span> <span class="ow">in</span> <span class="n">kwargs</span> <span class="ow">or</span> <span class="s1">&#39;description&#39;</span> <span class="ow">in</span> <span class="n">kwargs</span><span class="p">:</span>
<span class="n">title</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">&#39;title&#39;</span><span class="p">,</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;subcommands&#39;</span><span class="p">))</span>
<span class="n">description</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">pop</span><span class="p">(</span><span class="s1">&#39;description&#39;</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_subparsers</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">add_argument_group</span><span class="p">(</span><span class="n">title</span><span class="p">,</span> <span class="n">description</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_subparsers</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_positionals</span>
<span class="c1"># prog defaults to the usage message of this parser, skipping</span>
<span class="c1"># optional arguments and with no &quot;usage:&quot; prefix</span>
<span class="k">if</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;prog&#39;</span><span class="p">)</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">formatter</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_formatter</span><span class="p">()</span>
<span class="n">positionals</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_positional_actions</span><span class="p">()</span>
<span class="n">groups</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mutually_exclusive_groups</span>
<span class="n">formatter</span><span class="o">.</span><span class="n">add_usage</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">usage</span><span class="p">,</span> <span class="n">positionals</span><span class="p">,</span> <span class="n">groups</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
<span class="n">kwargs</span><span class="p">[</span><span class="s1">&#39;prog&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">formatter</span><span class="o">.</span><span class="n">format_help</span><span class="p">()</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
<span class="c1"># create the parsers action and add it to the positionals list</span>
<span class="n">parsers_class</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_pop_action_class</span><span class="p">(</span><span class="n">kwargs</span><span class="p">,</span> <span class="s1">&#39;parsers&#39;</span><span class="p">)</span>
<span class="n">action</span> <span class="o">=</span> <span class="n">parsers_class</span><span class="p">(</span><span class="n">option_strings</span><span class="o">=</span><span class="p">[],</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_subparsers</span><span class="o">.</span><span class="n">_add_action</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="c1"># return the created parsers action</span>
<span class="k">return</span> <span class="n">action</span></div>
<span class="k">def</span><span class="w"> </span><span class="nf">_add_action</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">option_strings</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_optionals</span><span class="o">.</span><span class="n">_add_action</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_positionals</span><span class="o">.</span><span class="n">_add_action</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="k">return</span> <span class="n">action</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_optional_actions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="n">action</span>
<span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">option_strings</span><span class="p">]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_positional_actions</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="n">action</span>
<span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">action</span><span class="o">.</span><span class="n">option_strings</span><span class="p">]</span>
<span class="c1"># =====================================</span>
<span class="c1"># Command line argument parsing methods</span>
<span class="c1"># =====================================</span>
<div class="viewcode-block" id="ArgumentParser.parse_args">
<a class="viewcode-back" href="../api/evennia.server.profiling.dummyrunner.html#evennia.server.evennia_launcher.ArgumentParser.parse_args">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">parse_args</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">namespace</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">args</span><span class="p">,</span> <span class="n">argv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parse_known_args</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">namespace</span><span class="p">)</span>
<span class="k">if</span> <span class="n">argv</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;unrecognized arguments: </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">)</span> <span class="o">%</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">argv</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">exit_on_error</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ArgumentError</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
<span class="k">return</span> <span class="n">args</span></div>
<div class="viewcode-block" id="ArgumentParser.parse_known_args">
<a class="viewcode-back" href="../api/evennia.server.profiling.dummyrunner.html#evennia.server.evennia_launcher.ArgumentParser.parse_known_args">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">parse_known_args</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">namespace</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_known_args2</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">namespace</span><span class="p">,</span> <span class="n">intermixed</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span></div>
<span class="k">def</span><span class="w"> </span><span class="nf">_parse_known_args2</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">namespace</span><span class="p">,</span> <span class="n">intermixed</span><span class="p">):</span>
<span class="k">if</span> <span class="n">args</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="c1"># args default to the system args</span>
<span class="n">args</span> <span class="o">=</span> <span class="n">_sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># make sure that args are mutable</span>
<span class="n">args</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">args</span><span class="p">)</span>
<span class="c1"># default Namespace built from parser defaults</span>
<span class="k">if</span> <span class="n">namespace</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">namespace</span> <span class="o">=</span> <span class="n">Namespace</span><span class="p">()</span>
<span class="c1"># add any action defaults that aren&#39;t present</span>
<span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span><span class="p">:</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">dest</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">SUPPRESS</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="n">action</span><span class="o">.</span><span class="n">dest</span><span class="p">):</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">default</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">SUPPRESS</span><span class="p">:</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="n">action</span><span class="o">.</span><span class="n">dest</span><span class="p">,</span> <span class="n">action</span><span class="o">.</span><span class="n">default</span><span class="p">)</span>
<span class="c1"># add any parser defaults that aren&#39;t present</span>
<span class="k">for</span> <span class="n">dest</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_defaults</span><span class="p">:</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="n">dest</span><span class="p">):</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="n">dest</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_defaults</span><span class="p">[</span><span class="n">dest</span><span class="p">])</span>
<span class="c1"># parse the arguments and exit if there are any errors</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">exit_on_error</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">namespace</span><span class="p">,</span> <span class="n">args</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_known_args</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">namespace</span><span class="p">,</span> <span class="n">intermixed</span><span class="p">)</span>
<span class="k">except</span> <span class="n">ArgumentError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">err</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">namespace</span><span class="p">,</span> <span class="n">args</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_known_args</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">namespace</span><span class="p">,</span> <span class="n">intermixed</span><span class="p">)</span>
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="n">_UNRECOGNIZED_ARGS_ATTR</span><span class="p">):</span>
<span class="n">args</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="nb">getattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="n">_UNRECOGNIZED_ARGS_ATTR</span><span class="p">))</span>
<span class="nb">delattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="n">_UNRECOGNIZED_ARGS_ATTR</span><span class="p">)</span>
<span class="k">return</span> <span class="n">namespace</span><span class="p">,</span> <span class="n">args</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_parse_known_args</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg_strings</span><span class="p">,</span> <span class="n">namespace</span><span class="p">,</span> <span class="n">intermixed</span><span class="p">):</span>
<span class="c1"># replace arg strings that are file references</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">fromfile_prefix_chars</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">arg_strings</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_read_args_from_files</span><span class="p">(</span><span class="n">arg_strings</span><span class="p">)</span>
<span class="c1"># map all mutually exclusive arguments to the other arguments</span>
<span class="c1"># they can&#39;t occur with</span>
<span class="n">action_conflicts</span> <span class="o">=</span> <span class="p">{}</span>
<span class="k">for</span> <span class="n">mutex_group</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mutually_exclusive_groups</span><span class="p">:</span>
<span class="n">group_actions</span> <span class="o">=</span> <span class="n">mutex_group</span><span class="o">.</span><span class="n">_group_actions</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">mutex_action</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">mutex_group</span><span class="o">.</span><span class="n">_group_actions</span><span class="p">):</span>
<span class="n">conflicts</span> <span class="o">=</span> <span class="n">action_conflicts</span><span class="o">.</span><span class="n">setdefault</span><span class="p">(</span><span class="n">mutex_action</span><span class="p">,</span> <span class="p">[])</span>
<span class="n">conflicts</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">group_actions</span><span class="p">[:</span><span class="n">i</span><span class="p">])</span>
<span class="n">conflicts</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">group_actions</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">:])</span>
<span class="c1"># find all option indices, and determine the arg_string_pattern</span>
<span class="c1"># which has an &#39;O&#39; if there is an option at an index,</span>
<span class="c1"># an &#39;A&#39; if there is an argument, or a &#39;-&#39; if there is a &#39;--&#39;</span>
<span class="n">option_string_indices</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">arg_string_pattern_parts</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">arg_strings_iter</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="n">arg_strings</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">arg_string</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">arg_strings_iter</span><span class="p">):</span>
<span class="c1"># all args after -- are non-options</span>
<span class="k">if</span> <span class="n">arg_string</span> <span class="o">==</span> <span class="s1">&#39;--&#39;</span><span class="p">:</span>
<span class="n">arg_string_pattern_parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">)</span>
<span class="k">for</span> <span class="n">arg_string</span> <span class="ow">in</span> <span class="n">arg_strings_iter</span><span class="p">:</span>
<span class="n">arg_string_pattern_parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;A&#39;</span><span class="p">)</span>
<span class="c1"># otherwise, add the arg to the arg strings</span>
<span class="c1"># and note the index if it was an option</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">option_tuples</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_optional</span><span class="p">(</span><span class="n">arg_string</span><span class="p">)</span>
<span class="k">if</span> <span class="n">option_tuples</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">pattern</span> <span class="o">=</span> <span class="s1">&#39;A&#39;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">option_string_indices</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">option_tuples</span>
<span class="n">pattern</span> <span class="o">=</span> <span class="s1">&#39;O&#39;</span>
<span class="n">arg_string_pattern_parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">pattern</span><span class="p">)</span>
<span class="c1"># join the pieces together to form the pattern</span>
<span class="n">arg_strings_pattern</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">arg_string_pattern_parts</span><span class="p">)</span>
<span class="c1"># converts arg strings to the appropriate and then takes the action</span>
<span class="n">seen_actions</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="n">seen_non_default_actions</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="n">warned</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
<span class="k">def</span><span class="w"> </span><span class="nf">take_action</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">argument_strings</span><span class="p">,</span> <span class="n">option_string</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">seen_actions</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="n">argument_values</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_values</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">argument_strings</span><span class="p">)</span>
<span class="c1"># error if this argument is not allowed with other previously</span>
<span class="c1"># seen arguments</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">option_strings</span> <span class="ow">or</span> <span class="n">argument_strings</span><span class="p">:</span>
<span class="n">seen_non_default_actions</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="k">for</span> <span class="n">conflict_action</span> <span class="ow">in</span> <span class="n">action_conflicts</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="p">[]):</span>
<span class="k">if</span> <span class="n">conflict_action</span> <span class="ow">in</span> <span class="n">seen_non_default_actions</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;not allowed with argument </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">)</span>
<span class="n">action_name</span> <span class="o">=</span> <span class="n">_get_action_name</span><span class="p">(</span><span class="n">conflict_action</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">ArgumentError</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">msg</span> <span class="o">%</span> <span class="n">action_name</span><span class="p">)</span>
<span class="c1"># take the action if we didn&#39;t receive a SUPPRESS value</span>
<span class="c1"># (e.g. from a default)</span>
<span class="k">if</span> <span class="n">argument_values</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">SUPPRESS</span><span class="p">:</span>
<span class="n">action</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">namespace</span><span class="p">,</span> <span class="n">argument_values</span><span class="p">,</span> <span class="n">option_string</span><span class="p">)</span>
<span class="c1"># function to convert arg_strings into an optional action</span>
<span class="k">def</span><span class="w"> </span><span class="nf">consume_optional</span><span class="p">(</span><span class="n">start_index</span><span class="p">):</span>
<span class="c1"># get the optional identified at this index</span>
<span class="n">option_tuples</span> <span class="o">=</span> <span class="n">option_string_indices</span><span class="p">[</span><span class="n">start_index</span><span class="p">]</span>
<span class="c1"># if multiple actions match, the option string was ambiguous</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">option_tuples</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">options</span> <span class="o">=</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="n">option_string</span>
<span class="k">for</span> <span class="n">action</span><span class="p">,</span> <span class="n">option_string</span><span class="p">,</span> <span class="n">sep</span><span class="p">,</span> <span class="n">explicit_arg</span> <span class="ow">in</span> <span class="n">option_tuples</span><span class="p">])</span>
<span class="n">args</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;option&#39;</span><span class="p">:</span> <span class="n">arg_strings</span><span class="p">[</span><span class="n">start_index</span><span class="p">],</span> <span class="s1">&#39;matches&#39;</span><span class="p">:</span> <span class="n">options</span><span class="p">}</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;ambiguous option: </span><span class="si">%(option)s</span><span class="s1"> could match </span><span class="si">%(matches)s</span><span class="s1">&#39;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">ArgumentError</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">msg</span> <span class="o">%</span> <span class="n">args</span><span class="p">)</span>
<span class="n">action</span><span class="p">,</span> <span class="n">option_string</span><span class="p">,</span> <span class="n">sep</span><span class="p">,</span> <span class="n">explicit_arg</span> <span class="o">=</span> <span class="n">option_tuples</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="c1"># identify additional optionals in the same arg string</span>
<span class="c1"># (e.g. -xyz is the same as -x -y -z if no args are required)</span>
<span class="n">match_argument</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match_argument</span>
<span class="n">action_tuples</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
<span class="c1"># if we found no optional action, skip it</span>
<span class="k">if</span> <span class="n">action</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">extras</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">arg_strings</span><span class="p">[</span><span class="n">start_index</span><span class="p">])</span>
<span class="n">extras_pattern</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;O&#39;</span><span class="p">)</span>
<span class="k">return</span> <span class="n">start_index</span> <span class="o">+</span> <span class="mi">1</span>
<span class="c1"># if there is an explicit argument, try to match the</span>
<span class="c1"># optional&#39;s string arguments to only this</span>
<span class="k">if</span> <span class="n">explicit_arg</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">arg_count</span> <span class="o">=</span> <span class="n">match_argument</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="s1">&#39;A&#39;</span><span class="p">)</span>
<span class="c1"># if the action is a single-dash option and takes no</span>
<span class="c1"># arguments, try to parse more single-dash options out</span>
<span class="c1"># of the tail of the option string</span>
<span class="n">chars</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">prefix_chars</span>
<span class="k">if</span> <span class="p">(</span>
<span class="n">arg_count</span> <span class="o">==</span> <span class="mi">0</span>
<span class="ow">and</span> <span class="n">option_string</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">chars</span>
<span class="ow">and</span> <span class="n">explicit_arg</span> <span class="o">!=</span> <span class="s1">&#39;&#39;</span>
<span class="p">):</span>
<span class="k">if</span> <span class="n">sep</span> <span class="ow">or</span> <span class="n">explicit_arg</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="n">chars</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;ignored explicit argument </span><span class="si">%r</span><span class="s1">&#39;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">ArgumentError</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">msg</span> <span class="o">%</span> <span class="n">explicit_arg</span><span class="p">)</span>
<span class="n">action_tuples</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">action</span><span class="p">,</span> <span class="p">[],</span> <span class="n">option_string</span><span class="p">))</span>
<span class="n">char</span> <span class="o">=</span> <span class="n">option_string</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">option_string</span> <span class="o">=</span> <span class="n">char</span> <span class="o">+</span> <span class="n">explicit_arg</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">optionals_map</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_option_string_actions</span>
<span class="k">if</span> <span class="n">option_string</span> <span class="ow">in</span> <span class="n">optionals_map</span><span class="p">:</span>
<span class="n">action</span> <span class="o">=</span> <span class="n">optionals_map</span><span class="p">[</span><span class="n">option_string</span><span class="p">]</span>
<span class="n">explicit_arg</span> <span class="o">=</span> <span class="n">explicit_arg</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">explicit_arg</span><span class="p">:</span>
<span class="n">sep</span> <span class="o">=</span> <span class="n">explicit_arg</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">elif</span> <span class="n">explicit_arg</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;=&#39;</span><span class="p">:</span>
<span class="n">sep</span> <span class="o">=</span> <span class="s1">&#39;=&#39;</span>
<span class="n">explicit_arg</span> <span class="o">=</span> <span class="n">explicit_arg</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">sep</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">extras</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">char</span> <span class="o">+</span> <span class="n">explicit_arg</span><span class="p">)</span>
<span class="n">extras_pattern</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">&#39;O&#39;</span><span class="p">)</span>
<span class="n">stop</span> <span class="o">=</span> <span class="n">start_index</span> <span class="o">+</span> <span class="mi">1</span>
<span class="k">break</span>
<span class="c1"># if the action expect exactly one argument, we&#39;ve</span>
<span class="c1"># successfully matched the option; exit the loop</span>
<span class="k">elif</span> <span class="n">arg_count</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="n">stop</span> <span class="o">=</span> <span class="n">start_index</span> <span class="o">+</span> <span class="mi">1</span>
<span class="n">args</span> <span class="o">=</span> <span class="p">[</span><span class="n">explicit_arg</span><span class="p">]</span>
<span class="n">action_tuples</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">action</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">option_string</span><span class="p">))</span>
<span class="k">break</span>
<span class="c1"># error if a double-dash option did not use the</span>
<span class="c1"># explicit argument</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;ignored explicit argument </span><span class="si">%r</span><span class="s1">&#39;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">ArgumentError</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">msg</span> <span class="o">%</span> <span class="n">explicit_arg</span><span class="p">)</span>
<span class="c1"># if there is no explicit argument, try to match the</span>
<span class="c1"># optional&#39;s string arguments with the following strings</span>
<span class="c1"># if successful, exit the loop</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">start</span> <span class="o">=</span> <span class="n">start_index</span> <span class="o">+</span> <span class="mi">1</span>
<span class="n">selected_patterns</span> <span class="o">=</span> <span class="n">arg_strings_pattern</span><span class="p">[</span><span class="n">start</span><span class="p">:]</span>
<span class="n">arg_count</span> <span class="o">=</span> <span class="n">match_argument</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">selected_patterns</span><span class="p">)</span>
<span class="n">stop</span> <span class="o">=</span> <span class="n">start</span> <span class="o">+</span> <span class="n">arg_count</span>
<span class="n">args</span> <span class="o">=</span> <span class="n">arg_strings</span><span class="p">[</span><span class="n">start</span><span class="p">:</span><span class="n">stop</span><span class="p">]</span>
<span class="n">action_tuples</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">action</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">option_string</span><span class="p">))</span>
<span class="k">break</span>
<span class="c1"># add the Optional to the list and return the index at which</span>
<span class="c1"># the Optional&#39;s string args stopped</span>
<span class="k">assert</span> <span class="n">action_tuples</span>
<span class="k">for</span> <span class="n">action</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">option_string</span> <span class="ow">in</span> <span class="n">action_tuples</span><span class="p">:</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">deprecated</span> <span class="ow">and</span> <span class="n">option_string</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">warned</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_warning</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;option &#39;</span><span class="si">%(option)s</span><span class="s2">&#39; is deprecated&quot;</span><span class="p">)</span> <span class="o">%</span>
<span class="p">{</span><span class="s1">&#39;option&#39;</span><span class="p">:</span> <span class="n">option_string</span><span class="p">})</span>
<span class="n">warned</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">option_string</span><span class="p">)</span>
<span class="n">take_action</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">args</span><span class="p">,</span> <span class="n">option_string</span><span class="p">)</span>
<span class="k">return</span> <span class="n">stop</span>
<span class="c1"># the list of Positionals left to be parsed; this is modified</span>
<span class="c1"># by consume_positionals()</span>
<span class="n">positionals</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_positional_actions</span><span class="p">()</span>
<span class="c1"># function to convert arg_strings into positional actions</span>
<span class="k">def</span><span class="w"> </span><span class="nf">consume_positionals</span><span class="p">(</span><span class="n">start_index</span><span class="p">):</span>
<span class="c1"># match as many Positionals as possible</span>
<span class="n">match_partial</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_match_arguments_partial</span>
<span class="n">selected_pattern</span> <span class="o">=</span> <span class="n">arg_strings_pattern</span><span class="p">[</span><span class="n">start_index</span><span class="p">:]</span>
<span class="n">arg_counts</span> <span class="o">=</span> <span class="n">match_partial</span><span class="p">(</span><span class="n">positionals</span><span class="p">,</span> <span class="n">selected_pattern</span><span class="p">)</span>
<span class="c1"># slice off the appropriate arg strings for each Positional</span>
<span class="c1"># and add the Positional and its args to the list</span>
<span class="k">for</span> <span class="n">action</span><span class="p">,</span> <span class="n">arg_count</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">positionals</span><span class="p">,</span> <span class="n">arg_counts</span><span class="p">):</span>
<span class="n">args</span> <span class="o">=</span> <span class="n">arg_strings</span><span class="p">[</span><span class="n">start_index</span><span class="p">:</span> <span class="n">start_index</span> <span class="o">+</span> <span class="n">arg_count</span><span class="p">]</span>
<span class="c1"># Strip out the first &#39;--&#39; if it is not in REMAINDER arg.</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">nargs</span> <span class="o">==</span> <span class="n">PARSER</span><span class="p">:</span>
<span class="k">if</span> <span class="n">arg_strings_pattern</span><span class="p">[</span><span class="n">start_index</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;-&#39;</span><span class="p">:</span>
<span class="k">assert</span> <span class="n">args</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="s1">&#39;--&#39;</span>
<span class="n">args</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="s1">&#39;--&#39;</span><span class="p">)</span>
<span class="k">elif</span> <span class="n">action</span><span class="o">.</span><span class="n">nargs</span> <span class="o">!=</span> <span class="n">REMAINDER</span><span class="p">:</span>
<span class="k">if</span> <span class="p">(</span><span class="n">arg_strings_pattern</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;-&#39;</span><span class="p">,</span> <span class="n">start_index</span><span class="p">,</span>
<span class="n">start_index</span> <span class="o">+</span> <span class="n">arg_count</span><span class="p">)</span> <span class="o">&gt;=</span> <span class="mi">0</span><span class="p">):</span>
<span class="n">args</span><span class="o">.</span><span class="n">remove</span><span class="p">(</span><span class="s1">&#39;--&#39;</span><span class="p">)</span>
<span class="n">start_index</span> <span class="o">+=</span> <span class="n">arg_count</span>
<span class="k">if</span> <span class="n">args</span> <span class="ow">and</span> <span class="n">action</span><span class="o">.</span><span class="n">deprecated</span> <span class="ow">and</span> <span class="n">action</span><span class="o">.</span><span class="n">dest</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">warned</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_warning</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s2">&quot;argument &#39;</span><span class="si">%(argument_name)s</span><span class="s2">&#39; is deprecated&quot;</span><span class="p">)</span> <span class="o">%</span>
<span class="p">{</span><span class="s1">&#39;argument_name&#39;</span><span class="p">:</span> <span class="n">action</span><span class="o">.</span><span class="n">dest</span><span class="p">})</span>
<span class="n">warned</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">action</span><span class="o">.</span><span class="n">dest</span><span class="p">)</span>
<span class="n">take_action</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">args</span><span class="p">)</span>
<span class="c1"># slice off the Positionals that we just parsed and return the</span>
<span class="c1"># index at which the Positionals&#39; string args stopped</span>
<span class="n">positionals</span><span class="p">[:]</span> <span class="o">=</span> <span class="n">positionals</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">arg_counts</span><span class="p">):]</span>
<span class="k">return</span> <span class="n">start_index</span>
<span class="c1"># consume Positionals and Optionals alternately, until we have</span>
<span class="c1"># passed the last option string</span>
<span class="n">extras</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">extras_pattern</span> <span class="o">=</span> <span class="p">[]</span>
<span class="n">start_index</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">if</span> <span class="n">option_string_indices</span><span class="p">:</span>
<span class="n">max_option_string_index</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="n">option_string_indices</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">max_option_string_index</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span>
<span class="k">while</span> <span class="n">start_index</span> <span class="o">&lt;=</span> <span class="n">max_option_string_index</span><span class="p">:</span>
<span class="c1"># consume any Positionals preceding the next option</span>
<span class="n">next_option_string_index</span> <span class="o">=</span> <span class="n">start_index</span>
<span class="k">while</span> <span class="n">next_option_string_index</span> <span class="o">&lt;=</span> <span class="n">max_option_string_index</span><span class="p">:</span>
<span class="k">if</span> <span class="n">next_option_string_index</span> <span class="ow">in</span> <span class="n">option_string_indices</span><span class="p">:</span>
<span class="k">break</span>
<span class="n">next_option_string_index</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">intermixed</span> <span class="ow">and</span> <span class="n">start_index</span> <span class="o">!=</span> <span class="n">next_option_string_index</span><span class="p">:</span>
<span class="n">positionals_end_index</span> <span class="o">=</span> <span class="n">consume_positionals</span><span class="p">(</span><span class="n">start_index</span><span class="p">)</span>
<span class="c1"># only try to parse the next optional if we didn&#39;t consume</span>
<span class="c1"># the option string during the positionals parsing</span>
<span class="k">if</span> <span class="n">positionals_end_index</span> <span class="o">&gt;</span> <span class="n">start_index</span><span class="p">:</span>
<span class="n">start_index</span> <span class="o">=</span> <span class="n">positionals_end_index</span>
<span class="k">continue</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">start_index</span> <span class="o">=</span> <span class="n">positionals_end_index</span>
<span class="c1"># if we consumed all the positionals we could and we&#39;re not</span>
<span class="c1"># at the index of an option string, there were extra arguments</span>
<span class="k">if</span> <span class="n">start_index</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">option_string_indices</span><span class="p">:</span>
<span class="n">strings</span> <span class="o">=</span> <span class="n">arg_strings</span><span class="p">[</span><span class="n">start_index</span><span class="p">:</span><span class="n">next_option_string_index</span><span class="p">]</span>
<span class="n">extras</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">strings</span><span class="p">)</span>
<span class="n">extras_pattern</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">arg_strings_pattern</span><span class="p">[</span><span class="n">start_index</span><span class="p">:</span><span class="n">next_option_string_index</span><span class="p">])</span>
<span class="n">start_index</span> <span class="o">=</span> <span class="n">next_option_string_index</span>
<span class="c1"># consume the next optional and any arguments for it</span>
<span class="n">start_index</span> <span class="o">=</span> <span class="n">consume_optional</span><span class="p">(</span><span class="n">start_index</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">intermixed</span><span class="p">:</span>
<span class="c1"># consume any positionals following the last Optional</span>
<span class="n">stop_index</span> <span class="o">=</span> <span class="n">consume_positionals</span><span class="p">(</span><span class="n">start_index</span><span class="p">)</span>
<span class="c1"># if we didn&#39;t consume all the argument strings, there were extras</span>
<span class="n">extras</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">arg_strings</span><span class="p">[</span><span class="n">stop_index</span><span class="p">:])</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">extras</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">arg_strings</span><span class="p">[</span><span class="n">start_index</span><span class="p">:])</span>
<span class="n">extras_pattern</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">arg_strings_pattern</span><span class="p">[</span><span class="n">start_index</span><span class="p">:])</span>
<span class="n">extras_pattern</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">extras_pattern</span><span class="p">)</span>
<span class="k">assert</span> <span class="nb">len</span><span class="p">(</span><span class="n">extras_pattern</span><span class="p">)</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">extras</span><span class="p">)</span>
<span class="c1"># consume all positionals</span>
<span class="n">arg_strings</span> <span class="o">=</span> <span class="p">[</span><span class="n">s</span> <span class="k">for</span> <span class="n">s</span><span class="p">,</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">extras</span><span class="p">,</span> <span class="n">extras_pattern</span><span class="p">)</span> <span class="k">if</span> <span class="n">c</span> <span class="o">!=</span> <span class="s1">&#39;O&#39;</span><span class="p">]</span>
<span class="n">arg_strings_pattern</span> <span class="o">=</span> <span class="n">extras_pattern</span><span class="o">.</span><span class="n">replace</span><span class="p">(</span><span class="s1">&#39;O&#39;</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">)</span>
<span class="n">stop_index</span> <span class="o">=</span> <span class="n">consume_positionals</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
<span class="c1"># leave unknown optionals and non-consumed positionals in extras</span>
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">extras_pattern</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">stop_index</span><span class="p">:</span>
<span class="k">break</span>
<span class="k">if</span> <span class="n">c</span> <span class="o">!=</span> <span class="s1">&#39;O&#39;</span><span class="p">:</span>
<span class="n">stop_index</span> <span class="o">-=</span> <span class="mi">1</span>
<span class="n">extras</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">extras</span> <span class="o">=</span> <span class="p">[</span><span class="n">s</span> <span class="k">for</span> <span class="n">s</span> <span class="ow">in</span> <span class="n">extras</span> <span class="k">if</span> <span class="n">s</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">]</span>
<span class="c1"># make sure all required actions were present and also convert</span>
<span class="c1"># action defaults which were not given as arguments</span>
<span class="n">required_actions</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span><span class="p">:</span>
<span class="k">if</span> <span class="n">action</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">seen_actions</span><span class="p">:</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">required</span><span class="p">:</span>
<span class="n">required_actions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">_get_action_name</span><span class="p">(</span><span class="n">action</span><span class="p">))</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># Convert action default now instead of doing it before</span>
<span class="c1"># parsing arguments to avoid calling convert functions</span>
<span class="c1"># twice (which may fail) if the argument was given, but</span>
<span class="c1"># only if it was defined already in the namespace</span>
<span class="k">if</span> <span class="p">(</span><span class="n">action</span><span class="o">.</span><span class="n">default</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span>
<span class="nb">isinstance</span><span class="p">(</span><span class="n">action</span><span class="o">.</span><span class="n">default</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">and</span>
<span class="nb">hasattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="n">action</span><span class="o">.</span><span class="n">dest</span><span class="p">)</span> <span class="ow">and</span>
<span class="n">action</span><span class="o">.</span><span class="n">default</span> <span class="ow">is</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="n">action</span><span class="o">.</span><span class="n">dest</span><span class="p">)):</span>
<span class="nb">setattr</span><span class="p">(</span><span class="n">namespace</span><span class="p">,</span> <span class="n">action</span><span class="o">.</span><span class="n">dest</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_get_value</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">action</span><span class="o">.</span><span class="n">default</span><span class="p">))</span>
<span class="k">if</span> <span class="n">required_actions</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ArgumentError</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;the following arguments are required: </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">)</span> <span class="o">%</span>
<span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">required_actions</span><span class="p">))</span>
<span class="c1"># make sure all required groups had one option present</span>
<span class="k">for</span> <span class="n">group</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_mutually_exclusive_groups</span><span class="p">:</span>
<span class="k">if</span> <span class="n">group</span><span class="o">.</span><span class="n">required</span><span class="p">:</span>
<span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="n">group</span><span class="o">.</span><span class="n">_group_actions</span><span class="p">:</span>
<span class="k">if</span> <span class="n">action</span> <span class="ow">in</span> <span class="n">seen_non_default_actions</span><span class="p">:</span>
<span class="k">break</span>
<span class="c1"># if no actions were used, report the error</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">names</span> <span class="o">=</span> <span class="p">[</span><span class="n">_get_action_name</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="n">group</span><span class="o">.</span><span class="n">_group_actions</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">help</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">SUPPRESS</span><span class="p">]</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;one of the arguments </span><span class="si">%s</span><span class="s1"> is required&#39;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">ArgumentError</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">msg</span> <span class="o">%</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">names</span><span class="p">))</span>
<span class="c1"># return the updated namespace and the extra arguments</span>
<span class="k">return</span> <span class="n">namespace</span><span class="p">,</span> <span class="n">extras</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_read_args_from_files</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg_strings</span><span class="p">):</span>
<span class="c1"># expand arguments referencing files</span>
<span class="n">new_arg_strings</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">arg_string</span> <span class="ow">in</span> <span class="n">arg_strings</span><span class="p">:</span>
<span class="c1"># for regular arguments, just add them back into the list</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">arg_string</span> <span class="ow">or</span> <span class="n">arg_string</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">fromfile_prefix_chars</span><span class="p">:</span>
<span class="n">new_arg_strings</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">arg_string</span><span class="p">)</span>
<span class="c1"># replace arguments referencing files with the file content</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">try</span><span class="p">:</span>
<span class="k">with</span> <span class="nb">open</span><span class="p">(</span><span class="n">arg_string</span><span class="p">[</span><span class="mi">1</span><span class="p">:],</span>
<span class="n">encoding</span><span class="o">=</span><span class="n">_sys</span><span class="o">.</span><span class="n">getfilesystemencoding</span><span class="p">(),</span>
<span class="n">errors</span><span class="o">=</span><span class="n">_sys</span><span class="o">.</span><span class="n">getfilesystemencodeerrors</span><span class="p">())</span> <span class="k">as</span> <span class="n">args_file</span><span class="p">:</span>
<span class="n">arg_strings</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">arg_line</span> <span class="ow">in</span> <span class="n">args_file</span><span class="o">.</span><span class="n">read</span><span class="p">()</span><span class="o">.</span><span class="n">splitlines</span><span class="p">():</span>
<span class="k">for</span> <span class="n">arg</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">convert_arg_line_to_args</span><span class="p">(</span><span class="n">arg_line</span><span class="p">):</span>
<span class="n">arg_strings</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">arg</span><span class="p">)</span>
<span class="n">arg_strings</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_read_args_from_files</span><span class="p">(</span><span class="n">arg_strings</span><span class="p">)</span>
<span class="n">new_arg_strings</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="n">arg_strings</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">OSError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ArgumentError</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">err</span><span class="p">))</span>
<span class="c1"># return the modified argument list</span>
<span class="k">return</span> <span class="n">new_arg_strings</span>
<div class="viewcode-block" id="ArgumentParser.convert_arg_line_to_args">
<a class="viewcode-back" href="../api/evennia.server.profiling.dummyrunner.html#evennia.server.evennia_launcher.ArgumentParser.convert_arg_line_to_args">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">convert_arg_line_to_args</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg_line</span><span class="p">):</span>
<span class="k">return</span> <span class="p">[</span><span class="n">arg_line</span><span class="p">]</span></div>
<span class="k">def</span><span class="w"> </span><span class="nf">_match_argument</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="n">arg_strings_pattern</span><span class="p">):</span>
<span class="c1"># match the pattern for this action to the arg strings</span>
<span class="n">nargs_pattern</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_nargs_pattern</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="n">match</span> <span class="o">=</span> <span class="n">_re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">nargs_pattern</span><span class="p">,</span> <span class="n">arg_strings_pattern</span><span class="p">)</span>
<span class="c1"># raise an exception if we weren&#39;t able to find a match</span>
<span class="k">if</span> <span class="n">match</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">nargs_errors</span> <span class="o">=</span> <span class="p">{</span>
<span class="kc">None</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;expected one argument&#39;</span><span class="p">),</span>
<span class="n">OPTIONAL</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;expected at most one argument&#39;</span><span class="p">),</span>
<span class="n">ONE_OR_MORE</span><span class="p">:</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;expected at least one argument&#39;</span><span class="p">),</span>
<span class="p">}</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">nargs_errors</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">action</span><span class="o">.</span><span class="n">nargs</span><span class="p">)</span>
<span class="k">if</span> <span class="n">msg</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">ngettext</span><span class="p">(</span><span class="s1">&#39;expected </span><span class="si">%s</span><span class="s1"> argument&#39;</span><span class="p">,</span>
<span class="s1">&#39;expected </span><span class="si">%s</span><span class="s1"> arguments&#39;</span><span class="p">,</span>
<span class="n">action</span><span class="o">.</span><span class="n">nargs</span><span class="p">)</span> <span class="o">%</span> <span class="n">action</span><span class="o">.</span><span class="n">nargs</span>
<span class="k">raise</span> <span class="n">ArgumentError</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
<span class="c1"># return the number of arguments matched</span>
<span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="n">match</span><span class="o">.</span><span class="n">group</span><span class="p">(</span><span class="mi">1</span><span class="p">))</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_match_arguments_partial</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">actions</span><span class="p">,</span> <span class="n">arg_strings_pattern</span><span class="p">):</span>
<span class="c1"># progressively shorten the actions list by slicing off the</span>
<span class="c1"># final actions until we find a match</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">actions</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="mi">1</span><span class="p">):</span>
<span class="n">actions_slice</span> <span class="o">=</span> <span class="n">actions</span><span class="p">[:</span><span class="n">i</span><span class="p">]</span>
<span class="n">pattern</span> <span class="o">=</span> <span class="s1">&#39;&#39;</span><span class="o">.</span><span class="n">join</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_nargs_pattern</span><span class="p">(</span><span class="n">action</span><span class="p">)</span>
<span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="n">actions_slice</span><span class="p">])</span>
<span class="n">match</span> <span class="o">=</span> <span class="n">_re</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">pattern</span><span class="p">,</span> <span class="n">arg_strings_pattern</span><span class="p">)</span>
<span class="k">if</span> <span class="n">match</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">string</span><span class="p">)</span> <span class="k">for</span> <span class="n">string</span> <span class="ow">in</span> <span class="n">match</span><span class="o">.</span><span class="n">groups</span><span class="p">()]</span>
<span class="k">if</span> <span class="p">(</span><span class="n">match</span><span class="o">.</span><span class="n">end</span><span class="p">()</span> <span class="o">&lt;</span> <span class="nb">len</span><span class="p">(</span><span class="n">arg_strings_pattern</span><span class="p">)</span>
<span class="ow">and</span> <span class="n">arg_strings_pattern</span><span class="p">[</span><span class="n">match</span><span class="o">.</span><span class="n">end</span><span class="p">()]</span> <span class="o">==</span> <span class="s1">&#39;O&#39;</span><span class="p">):</span>
<span class="k">while</span> <span class="n">result</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">result</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span>
<span class="k">del</span> <span class="n">result</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">return</span> <span class="n">result</span>
<span class="k">return</span> <span class="p">[]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_parse_optional</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">arg_string</span><span class="p">):</span>
<span class="c1"># if it&#39;s an empty string, it was meant to be a positional</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">arg_string</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="c1"># if it doesn&#39;t start with a prefix, it was meant to be positional</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">arg_string</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">prefix_chars</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="c1"># if the option string is present in the parser, return the action</span>
<span class="k">if</span> <span class="n">arg_string</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_option_string_actions</span><span class="p">:</span>
<span class="n">action</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_option_string_actions</span><span class="p">[</span><span class="n">arg_string</span><span class="p">]</span>
<span class="k">return</span> <span class="p">[(</span><span class="n">action</span><span class="p">,</span> <span class="n">arg_string</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)]</span>
<span class="c1"># if it&#39;s just a single character, it was meant to be positional</span>
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">arg_string</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="c1"># if the option string before the &quot;=&quot; is present, return the action</span>
<span class="n">option_string</span><span class="p">,</span> <span class="n">sep</span><span class="p">,</span> <span class="n">explicit_arg</span> <span class="o">=</span> <span class="n">arg_string</span><span class="o">.</span><span class="n">partition</span><span class="p">(</span><span class="s1">&#39;=&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">sep</span> <span class="ow">and</span> <span class="n">option_string</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_option_string_actions</span><span class="p">:</span>
<span class="n">action</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_option_string_actions</span><span class="p">[</span><span class="n">option_string</span><span class="p">]</span>
<span class="k">return</span> <span class="p">[(</span><span class="n">action</span><span class="p">,</span> <span class="n">option_string</span><span class="p">,</span> <span class="n">sep</span><span class="p">,</span> <span class="n">explicit_arg</span><span class="p">)]</span>
<span class="c1"># search through all possible prefixes of the option string</span>
<span class="c1"># and all actions in the parser for possible interpretations</span>
<span class="n">option_tuples</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_option_tuples</span><span class="p">(</span><span class="n">arg_string</span><span class="p">)</span>
<span class="k">if</span> <span class="n">option_tuples</span><span class="p">:</span>
<span class="k">return</span> <span class="n">option_tuples</span>
<span class="c1"># if it was not found as an option, but it looks like a negative</span>
<span class="c1"># number, it was meant to be positional</span>
<span class="c1"># unless there are negative-number-like options</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_negative_number_matcher</span><span class="o">.</span><span class="n">match</span><span class="p">(</span><span class="n">arg_string</span><span class="p">):</span>
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_has_negative_number_optionals</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="c1"># if it contains a space, it was meant to be a positional</span>
<span class="k">if</span> <span class="s1">&#39; &#39;</span> <span class="ow">in</span> <span class="n">arg_string</span><span class="p">:</span>
<span class="k">return</span> <span class="kc">None</span>
<span class="c1"># it was meant to be an optional but there is no such option</span>
<span class="c1"># in this parser (though it might be a valid option in a subparser)</span>
<span class="k">return</span> <span class="p">[(</span><span class="kc">None</span><span class="p">,</span> <span class="n">arg_string</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)]</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_option_tuples</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">option_string</span><span class="p">):</span>
<span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
<span class="c1"># option strings starting with two prefix characters are only</span>
<span class="c1"># split at the &#39;=&#39;</span>
<span class="n">chars</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">prefix_chars</span>
<span class="k">if</span> <span class="n">option_string</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="n">chars</span> <span class="ow">and</span> <span class="n">option_string</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">in</span> <span class="n">chars</span><span class="p">:</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">allow_abbrev</span><span class="p">:</span>
<span class="n">option_prefix</span><span class="p">,</span> <span class="n">sep</span><span class="p">,</span> <span class="n">explicit_arg</span> <span class="o">=</span> <span class="n">option_string</span><span class="o">.</span><span class="n">partition</span><span class="p">(</span><span class="s1">&#39;=&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">sep</span><span class="p">:</span>
<span class="n">sep</span> <span class="o">=</span> <span class="n">explicit_arg</span> <span class="o">=</span> <span class="kc">None</span>
<span class="k">for</span> <span class="n">option_string</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_option_string_actions</span><span class="p">:</span>
<span class="k">if</span> <span class="n">option_string</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">option_prefix</span><span class="p">):</span>
<span class="n">action</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_option_string_actions</span><span class="p">[</span><span class="n">option_string</span><span class="p">]</span>
<span class="n">tup</span> <span class="o">=</span> <span class="n">action</span><span class="p">,</span> <span class="n">option_string</span><span class="p">,</span> <span class="n">sep</span><span class="p">,</span> <span class="n">explicit_arg</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tup</span><span class="p">)</span>
<span class="c1"># single character options can be concatenated with their arguments</span>
<span class="c1"># but multiple character options always have to have their argument</span>
<span class="c1"># separate</span>
<span class="k">elif</span> <span class="n">option_string</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">in</span> <span class="n">chars</span> <span class="ow">and</span> <span class="n">option_string</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">chars</span><span class="p">:</span>
<span class="n">option_prefix</span><span class="p">,</span> <span class="n">sep</span><span class="p">,</span> <span class="n">explicit_arg</span> <span class="o">=</span> <span class="n">option_string</span><span class="o">.</span><span class="n">partition</span><span class="p">(</span><span class="s1">&#39;=&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">sep</span><span class="p">:</span>
<span class="n">sep</span> <span class="o">=</span> <span class="n">explicit_arg</span> <span class="o">=</span> <span class="kc">None</span>
<span class="n">short_option_prefix</span> <span class="o">=</span> <span class="n">option_string</span><span class="p">[:</span><span class="mi">2</span><span class="p">]</span>
<span class="n">short_explicit_arg</span> <span class="o">=</span> <span class="n">option_string</span><span class="p">[</span><span class="mi">2</span><span class="p">:]</span>
<span class="k">for</span> <span class="n">option_string</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_option_string_actions</span><span class="p">:</span>
<span class="k">if</span> <span class="n">option_string</span> <span class="o">==</span> <span class="n">short_option_prefix</span><span class="p">:</span>
<span class="n">action</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_option_string_actions</span><span class="p">[</span><span class="n">option_string</span><span class="p">]</span>
<span class="n">tup</span> <span class="o">=</span> <span class="n">action</span><span class="p">,</span> <span class="n">option_string</span><span class="p">,</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="n">short_explicit_arg</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tup</span><span class="p">)</span>
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">allow_abbrev</span> <span class="ow">and</span> <span class="n">option_string</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="n">option_prefix</span><span class="p">):</span>
<span class="n">action</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_option_string_actions</span><span class="p">[</span><span class="n">option_string</span><span class="p">]</span>
<span class="n">tup</span> <span class="o">=</span> <span class="n">action</span><span class="p">,</span> <span class="n">option_string</span><span class="p">,</span> <span class="n">sep</span><span class="p">,</span> <span class="n">explicit_arg</span>
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">tup</span><span class="p">)</span>
<span class="c1"># shouldn&#39;t ever get here</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ArgumentError</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;unexpected option string: </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">)</span> <span class="o">%</span> <span class="n">option_string</span><span class="p">)</span>
<span class="c1"># return the collected option tuples</span>
<span class="k">return</span> <span class="n">result</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_nargs_pattern</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">):</span>
<span class="c1"># in all examples below, we have to allow for &#39;--&#39; args</span>
<span class="c1"># which are represented as &#39;-&#39; in the pattern</span>
<span class="n">nargs</span> <span class="o">=</span> <span class="n">action</span><span class="o">.</span><span class="n">nargs</span>
<span class="c1"># if this is an optional action, -- is not allowed</span>
<span class="n">option</span> <span class="o">=</span> <span class="n">action</span><span class="o">.</span><span class="n">option_strings</span>
<span class="c1"># the default (None) is assumed to be a single argument</span>
<span class="k">if</span> <span class="n">nargs</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">nargs_pattern</span> <span class="o">=</span> <span class="s1">&#39;([A])&#39;</span> <span class="k">if</span> <span class="n">option</span> <span class="k">else</span> <span class="s1">&#39;(-*A-*)&#39;</span>
<span class="c1"># allow zero or one arguments</span>
<span class="k">elif</span> <span class="n">nargs</span> <span class="o">==</span> <span class="n">OPTIONAL</span><span class="p">:</span>
<span class="n">nargs_pattern</span> <span class="o">=</span> <span class="s1">&#39;(A?)&#39;</span> <span class="k">if</span> <span class="n">option</span> <span class="k">else</span> <span class="s1">&#39;(-*A?-*)&#39;</span>
<span class="c1"># allow zero or more arguments</span>
<span class="k">elif</span> <span class="n">nargs</span> <span class="o">==</span> <span class="n">ZERO_OR_MORE</span><span class="p">:</span>
<span class="n">nargs_pattern</span> <span class="o">=</span> <span class="s1">&#39;(A*)&#39;</span> <span class="k">if</span> <span class="n">option</span> <span class="k">else</span> <span class="s1">&#39;(-*[A-]*)&#39;</span>
<span class="c1"># allow one or more arguments</span>
<span class="k">elif</span> <span class="n">nargs</span> <span class="o">==</span> <span class="n">ONE_OR_MORE</span><span class="p">:</span>
<span class="n">nargs_pattern</span> <span class="o">=</span> <span class="s1">&#39;(A+)&#39;</span> <span class="k">if</span> <span class="n">option</span> <span class="k">else</span> <span class="s1">&#39;(-*A[A-]*)&#39;</span>
<span class="c1"># allow any number of options or arguments</span>
<span class="k">elif</span> <span class="n">nargs</span> <span class="o">==</span> <span class="n">REMAINDER</span><span class="p">:</span>
<span class="n">nargs_pattern</span> <span class="o">=</span> <span class="s1">&#39;([AO]*)&#39;</span> <span class="k">if</span> <span class="n">option</span> <span class="k">else</span> <span class="s1">&#39;(.*)&#39;</span>
<span class="c1"># allow one argument followed by any number of options or arguments</span>
<span class="k">elif</span> <span class="n">nargs</span> <span class="o">==</span> <span class="n">PARSER</span><span class="p">:</span>
<span class="n">nargs_pattern</span> <span class="o">=</span> <span class="s1">&#39;(A[AO]*)&#39;</span> <span class="k">if</span> <span class="n">option</span> <span class="k">else</span> <span class="s1">&#39;(-*A[-AO]*)&#39;</span>
<span class="c1"># suppress action, like nargs=0</span>
<span class="k">elif</span> <span class="n">nargs</span> <span class="o">==</span> <span class="n">SUPPRESS</span><span class="p">:</span>
<span class="n">nargs_pattern</span> <span class="o">=</span> <span class="s1">&#39;()&#39;</span> <span class="k">if</span> <span class="n">option</span> <span class="k">else</span> <span class="s1">&#39;(-*)&#39;</span>
<span class="c1"># all others should be integers</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">nargs_pattern</span> <span class="o">=</span> <span class="s1">&#39;([AO]{</span><span class="si">%d</span><span class="s1">})&#39;</span> <span class="o">%</span> <span class="n">nargs</span> <span class="k">if</span> <span class="n">option</span> <span class="k">else</span> <span class="s1">&#39;((?:-*A){</span><span class="si">%d</span><span class="s1">}-*)&#39;</span> <span class="o">%</span> <span class="n">nargs</span>
<span class="c1"># return the pattern</span>
<span class="k">return</span> <span class="n">nargs_pattern</span>
<span class="c1"># ========================</span>
<span class="c1"># Alt command line argument parsing, allowing free intermix</span>
<span class="c1"># ========================</span>
<div class="viewcode-block" id="ArgumentParser.parse_intermixed_args">
<a class="viewcode-back" href="../api/evennia.server.profiling.dummyrunner.html#evennia.server.evennia_launcher.ArgumentParser.parse_intermixed_args">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">parse_intermixed_args</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">namespace</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="n">args</span><span class="p">,</span> <span class="n">argv</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">parse_known_intermixed_args</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">namespace</span><span class="p">)</span>
<span class="k">if</span> <span class="n">argv</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;unrecognized arguments: </span><span class="si">%s</span><span class="s1">&#39;</span><span class="p">)</span> <span class="o">%</span> <span class="s1">&#39; &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">argv</span><span class="p">)</span>
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">exit_on_error</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">error</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="k">raise</span> <span class="n">ArgumentError</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
<span class="k">return</span> <span class="n">args</span></div>
<div class="viewcode-block" id="ArgumentParser.parse_known_intermixed_args">
<a class="viewcode-back" href="../api/evennia.server.profiling.dummyrunner.html#evennia.server.evennia_launcher.ArgumentParser.parse_known_intermixed_args">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">parse_known_intermixed_args</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">args</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">namespace</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="c1"># returns a namespace and list of extras</span>
<span class="c1">#</span>
<span class="c1"># positional can be freely intermixed with optionals. optionals are</span>
<span class="c1"># first parsed with all positional arguments deactivated. The &#39;extras&#39;</span>
<span class="c1"># are then parsed. If the parser definition is incompatible with the</span>
<span class="c1"># intermixed assumptions (e.g. use of REMAINDER, subparsers) a</span>
<span class="c1"># TypeError is raised.</span>
<span class="n">positionals</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_positional_actions</span><span class="p">()</span>
<span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="n">action</span> <span class="k">for</span> <span class="n">action</span> <span class="ow">in</span> <span class="n">positionals</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">nargs</span> <span class="ow">in</span> <span class="p">[</span><span class="n">PARSER</span><span class="p">,</span> <span class="n">REMAINDER</span><span class="p">]]</span>
<span class="k">if</span> <span class="n">a</span><span class="p">:</span>
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="s1">&#39;parse_intermixed_args: positional arg&#39;</span>
<span class="s1">&#39; with nargs=</span><span class="si">%s</span><span class="s1">&#39;</span><span class="o">%</span><span class="n">a</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">nargs</span><span class="p">)</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_parse_known_args2</span><span class="p">(</span><span class="n">args</span><span class="p">,</span> <span class="n">namespace</span><span class="p">,</span> <span class="n">intermixed</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span></div>
<span class="c1"># ========================</span>
<span class="c1"># Value conversion methods</span>
<span class="c1"># ========================</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_values</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="n">arg_strings</span><span class="p">):</span>
<span class="c1"># optional argument produces a default when not present</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">arg_strings</span> <span class="ow">and</span> <span class="n">action</span><span class="o">.</span><span class="n">nargs</span> <span class="o">==</span> <span class="n">OPTIONAL</span><span class="p">:</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">option_strings</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">action</span><span class="o">.</span><span class="n">const</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">action</span><span class="o">.</span><span class="n">default</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="nb">str</span><span class="p">)</span> <span class="ow">and</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="n">SUPPRESS</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_value</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check_value</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="c1"># when nargs=&#39;*&#39; on a positional, if there were no command-line</span>
<span class="c1"># args, use the default if it is anything other than None</span>
<span class="k">elif</span> <span class="p">(</span><span class="ow">not</span> <span class="n">arg_strings</span> <span class="ow">and</span> <span class="n">action</span><span class="o">.</span><span class="n">nargs</span> <span class="o">==</span> <span class="n">ZERO_OR_MORE</span> <span class="ow">and</span>
<span class="ow">not</span> <span class="n">action</span><span class="o">.</span><span class="n">option_strings</span><span class="p">):</span>
<span class="k">if</span> <span class="n">action</span><span class="o">.</span><span class="n">default</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">action</span><span class="o">.</span><span class="n">default</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check_value</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1"># since arg_strings is always [] at this point</span>
<span class="c1"># there is no need to use self._check_value(action, value)</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">arg_strings</span>
<span class="c1"># single argument or optional argument produces a single value</span>
<span class="k">elif</span> <span class="nb">len</span><span class="p">(</span><span class="n">arg_strings</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">action</span><span class="o">.</span><span class="n">nargs</span> <span class="ow">in</span> <span class="p">[</span><span class="kc">None</span><span class="p">,</span> <span class="n">OPTIONAL</span><span class="p">]:</span>
<span class="n">arg_string</span><span class="p">,</span> <span class="o">=</span> <span class="n">arg_strings</span>
<span class="n">value</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_value</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">arg_string</span><span class="p">)</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check_value</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">value</span><span class="p">)</span>
<span class="c1"># REMAINDER arguments convert all values, checking none</span>
<span class="k">elif</span> <span class="n">action</span><span class="o">.</span><span class="n">nargs</span> <span class="o">==</span> <span class="n">REMAINDER</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_value</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">arg_strings</span><span class="p">]</span>
<span class="c1"># PARSER arguments convert all values, but check only the first</span>
<span class="k">elif</span> <span class="n">action</span><span class="o">.</span><span class="n">nargs</span> <span class="o">==</span> <span class="n">PARSER</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_value</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">arg_strings</span><span class="p">]</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check_value</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">value</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
<span class="c1"># SUPPRESS argument does not put anything in the namespace</span>
<span class="k">elif</span> <span class="n">action</span><span class="o">.</span><span class="n">nargs</span> <span class="o">==</span> <span class="n">SUPPRESS</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="n">SUPPRESS</span>
<span class="c1"># all other types of nargs produce a list</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">value</span> <span class="o">=</span> <span class="p">[</span><span class="bp">self</span><span class="o">.</span><span class="n">_get_value</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span> <span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">arg_strings</span><span class="p">]</span>
<span class="k">for</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">value</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_check_value</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span>
<span class="c1"># return the converted value</span>
<span class="k">return</span> <span class="n">value</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="n">arg_string</span><span class="p">):</span>
<span class="n">type_func</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_registry_get</span><span class="p">(</span><span class="s1">&#39;type&#39;</span><span class="p">,</span> <span class="n">action</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="n">action</span><span class="o">.</span><span class="n">type</span><span class="p">)</span>
<span class="k">if</span> <span class="ow">not</span> <span class="nb">callable</span><span class="p">(</span><span class="n">type_func</span><span class="p">):</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%r</span><span class="s1"> is not callable&#39;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">ArgumentError</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">msg</span> <span class="o">%</span> <span class="n">type_func</span><span class="p">)</span>
<span class="c1"># convert the value to the appropriate type</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">result</span> <span class="o">=</span> <span class="n">type_func</span><span class="p">(</span><span class="n">arg_string</span><span class="p">)</span>
<span class="c1"># ArgumentTypeErrors indicate errors</span>
<span class="k">except</span> <span class="n">ArgumentTypeError</span> <span class="k">as</span> <span class="n">err</span><span class="p">:</span>
<span class="n">msg</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">err</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">ArgumentError</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">msg</span><span class="p">)</span>
<span class="c1"># TypeErrors or ValueErrors also indicate errors</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">TypeError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">):</span>
<span class="n">name</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">action</span><span class="o">.</span><span class="n">type</span><span class="p">,</span> <span class="s1">&#39;__name__&#39;</span><span class="p">,</span> <span class="nb">repr</span><span class="p">(</span><span class="n">action</span><span class="o">.</span><span class="n">type</span><span class="p">))</span>
<span class="n">args</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;type&#39;</span><span class="p">:</span> <span class="n">name</span><span class="p">,</span> <span class="s1">&#39;value&#39;</span><span class="p">:</span> <span class="n">arg_string</span><span class="p">}</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;invalid </span><span class="si">%(type)s</span><span class="s1"> value: </span><span class="si">%(value)r</span><span class="s1">&#39;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">ArgumentError</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">msg</span> <span class="o">%</span> <span class="n">args</span><span class="p">)</span>
<span class="c1"># return the converted value</span>
<span class="k">return</span> <span class="n">result</span>
<span class="k">def</span><span class="w"> </span><span class="nf">_check_value</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">action</span><span class="p">,</span> <span class="n">value</span><span class="p">):</span>
<span class="c1"># converted value must be one of the choices (if specified)</span>
<span class="n">choices</span> <span class="o">=</span> <span class="n">action</span><span class="o">.</span><span class="n">choices</span>
<span class="k">if</span> <span class="n">choices</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">choices</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
<span class="n">choices</span> <span class="o">=</span> <span class="nb">iter</span><span class="p">(</span><span class="n">choices</span><span class="p">)</span>
<span class="k">if</span> <span class="n">value</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">choices</span><span class="p">:</span>
<span class="n">args</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;value&#39;</span><span class="p">:</span> <span class="nb">str</span><span class="p">(</span><span class="n">value</span><span class="p">),</span>
<span class="s1">&#39;choices&#39;</span><span class="p">:</span> <span class="s1">&#39;, &#39;</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">action</span><span class="o">.</span><span class="n">choices</span><span class="p">))}</span>
<span class="n">msg</span> <span class="o">=</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;invalid choice: </span><span class="si">%(value)r</span><span class="s1"> (choose from </span><span class="si">%(choices)s</span><span class="s1">)&#39;</span><span class="p">)</span>
<span class="k">raise</span> <span class="n">ArgumentError</span><span class="p">(</span><span class="n">action</span><span class="p">,</span> <span class="n">msg</span> <span class="o">%</span> <span class="n">args</span><span class="p">)</span>
<span class="c1"># =======================</span>
<span class="c1"># Help-formatting methods</span>
<span class="c1"># =======================</span>
<div class="viewcode-block" id="ArgumentParser.format_usage">
<a class="viewcode-back" href="../api/evennia.server.profiling.dummyrunner.html#evennia.server.evennia_launcher.ArgumentParser.format_usage">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">format_usage</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">formatter</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_formatter</span><span class="p">()</span>
<span class="n">formatter</span><span class="o">.</span><span class="n">add_usage</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">usage</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_mutually_exclusive_groups</span><span class="p">)</span>
<span class="k">return</span> <span class="n">formatter</span><span class="o">.</span><span class="n">format_help</span><span class="p">()</span></div>
<div class="viewcode-block" id="ArgumentParser.format_help">
<a class="viewcode-back" href="../api/evennia.server.profiling.dummyrunner.html#evennia.server.evennia_launcher.ArgumentParser.format_help">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">format_help</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="n">formatter</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_get_formatter</span><span class="p">()</span>
<span class="c1"># usage</span>
<span class="n">formatter</span><span class="o">.</span><span class="n">add_usage</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">usage</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_actions</span><span class="p">,</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_mutually_exclusive_groups</span><span class="p">)</span>
<span class="c1"># description</span>
<span class="n">formatter</span><span class="o">.</span><span class="n">add_text</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">description</span><span class="p">)</span>
<span class="c1"># positionals, optionals and user-defined groups</span>
<span class="k">for</span> <span class="n">action_group</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_action_groups</span><span class="p">:</span>
<span class="n">formatter</span><span class="o">.</span><span class="n">start_section</span><span class="p">(</span><span class="n">action_group</span><span class="o">.</span><span class="n">title</span><span class="p">)</span>
<span class="n">formatter</span><span class="o">.</span><span class="n">add_text</span><span class="p">(</span><span class="n">action_group</span><span class="o">.</span><span class="n">description</span><span class="p">)</span>
<span class="n">formatter</span><span class="o">.</span><span class="n">add_arguments</span><span class="p">(</span><span class="n">action_group</span><span class="o">.</span><span class="n">_group_actions</span><span class="p">)</span>
<span class="n">formatter</span><span class="o">.</span><span class="n">end_section</span><span class="p">()</span>
<span class="c1"># epilog</span>
<span class="n">formatter</span><span class="o">.</span><span class="n">add_text</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">epilog</span><span class="p">)</span>
<span class="c1"># determine help from format above</span>
<span class="k">return</span> <span class="n">formatter</span><span class="o">.</span><span class="n">format_help</span><span class="p">()</span></div>
<span class="k">def</span><span class="w"> </span><span class="nf">_get_formatter</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">formatter_class</span><span class="p">(</span><span class="n">prog</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">prog</span><span class="p">)</span>
<span class="c1"># =====================</span>
<span class="c1"># Help-printing methods</span>
<span class="c1"># =====================</span>
<div class="viewcode-block" id="ArgumentParser.print_usage">
<a class="viewcode-back" href="../api/evennia.server.profiling.dummyrunner.html#evennia.server.evennia_launcher.ArgumentParser.print_usage">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">print_usage</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">file</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">file</span> <span class="o">=</span> <span class="n">_sys</span><span class="o">.</span><span class="n">stdout</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_print_message</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">format_usage</span><span class="p">(),</span> <span class="n">file</span><span class="p">)</span></div>
<div class="viewcode-block" id="ArgumentParser.print_help">
<a class="viewcode-back" href="../api/evennia.server.profiling.dummyrunner.html#evennia.server.evennia_launcher.ArgumentParser.print_help">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">print_help</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">file</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">file</span> <span class="o">=</span> <span class="n">_sys</span><span class="o">.</span><span class="n">stdout</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_print_message</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">format_help</span><span class="p">(),</span> <span class="n">file</span><span class="p">)</span></div>
<span class="k">def</span><span class="w"> </span><span class="nf">_print_message</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">message</span><span class="p">:</span>
<span class="n">file</span> <span class="o">=</span> <span class="n">file</span> <span class="ow">or</span> <span class="n">_sys</span><span class="o">.</span><span class="n">stderr</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">file</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">AttributeError</span><span class="p">,</span> <span class="ne">OSError</span><span class="p">):</span>
<span class="k">pass</span>
<span class="c1"># ===============</span>
<span class="c1"># Exiting methods</span>
<span class="c1"># ===============</span>
<div class="viewcode-block" id="ArgumentParser.exit">
<a class="viewcode-back" href="../api/evennia.server.profiling.dummyrunner.html#evennia.server.evennia_launcher.ArgumentParser.exit">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">exit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">status</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">message</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
<span class="k">if</span> <span class="n">message</span><span class="p">:</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_print_message</span><span class="p">(</span><span class="n">message</span><span class="p">,</span> <span class="n">_sys</span><span class="o">.</span><span class="n">stderr</span><span class="p">)</span>
<span class="n">_sys</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="n">status</span><span class="p">)</span></div>
<div class="viewcode-block" id="ArgumentParser.error">
<a class="viewcode-back" href="../api/evennia.server.profiling.dummyrunner.html#evennia.server.evennia_launcher.ArgumentParser.error">[docs]</a>
<span class="k">def</span><span class="w"> </span><span class="nf">error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="w"> </span><span class="sd">&quot;&quot;&quot;error(message: string)</span>
<span class="sd"> Prints a usage message incorporating the message to stderr and</span>
<span class="sd"> exits.</span>
<span class="sd"> If you override this in a subclass, it should not return -- it</span>
<span class="sd"> should either exit or raise an exception.</span>
<span class="sd"> &quot;&quot;&quot;</span>
<span class="bp">self</span><span class="o">.</span><span class="n">print_usage</span><span class="p">(</span><span class="n">_sys</span><span class="o">.</span><span class="n">stderr</span><span class="p">)</span>
<span class="n">args</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;prog&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">prog</span><span class="p">,</span> <span class="s1">&#39;message&#39;</span><span class="p">:</span> <span class="n">message</span><span class="p">}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">exit</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="n">_</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%(prog)s</span><span class="s1">: error: </span><span class="si">%(message)s</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span> <span class="o">%</span> <span class="n">args</span><span class="p">)</span></div>
<span class="k">def</span><span class="w"> </span><span class="nf">_warning</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">message</span><span class="p">):</span>
<span class="n">args</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;prog&#39;</span><span class="p">:</span> <span class="bp">self</span><span class="o">.</span><span class="n">prog</span><span class="p">,</span> <span class="s1">&#39;message&#39;</span><span class="p">:</span> <span class="n">message</span><span class="p">}</span>
<span class="bp">self</span><span class="o">.</span><span class="n">_print_message</span><span class="p">(</span><span class="n">_</span><span class="p">(</span><span class="s1">&#39;</span><span class="si">%(prog)s</span><span class="s1">: warning: </span><span class="si">%(message)s</span><span class="se">\n</span><span class="s1">&#39;</span><span class="p">)</span> <span class="o">%</span> <span class="n">args</span><span class="p">,</span> <span class="n">_sys</span><span class="o">.</span><span class="n">stderr</span><span class="p">)</span></div>
</pre></div>
</div>
</div>
</div>
</div>
<div class="related" role="navigation" aria-label="related navigation">
<h3>Navigation</h3>
<ul>
<li class="right" style="margin-right: 10px">
<a href="../genindex.html" title="General Index"
>index</a></li>
<li class="right" >
<a href="../py-modindex.html" title="Python Module Index"
>modules</a> |</li>
<li class="nav-item nav-item-0"><a href="../index.html">Evennia latest</a> &#187;</li>
<li class="nav-item nav-item-1"><a href="index.html" >Module code</a> &#187;</li>
<li class="nav-item nav-item-this"><a href="">argparse</a></li>
</ul>
</div>
<div class="footer" role="contentinfo">
&#169; Copyright 2024, The Evennia developer community.
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3.
</div>
</body>
</html>