argparse - 命令行选项与参数解析(转)

原文:argparse – Command line option and argument parsing

译者:youngsterxyf

argparse模块作为optparse的一个替代被添加到Python2.7。argparse的实现支持一些不易于添加到optparse以及要求向后不兼容API变化的特性,因此以一个新模块添加到标准库。

与optparse相比较

argparse的API类似于optparse,甚至在很多情况下通过更新所使用的类名和方法名,使用argparse作为一个简单的替代。然而,有些地方在添加新特性时不能保持直接兼容性。

你必须视情况决定是否升级已有的程序。如果你已编写了额外的代码以弥补optparse的局限,也许你想升级程序以减少你需要维护的代码量。若argparse在所有部署平台上都可用,那么新的程序应尽可能使用argparse。

设置一个解析器

使用argparse的第一步就是创建一个解析器对象,并告诉它将会有些什么参数。那么当你的程序运行时,该解析器就可以用于处理命令行参数。

解析器类是 ArgumentParser 。构造方法接收几个参数来设置用于程序帮助文本的描述信息以及其他全局的行为或设置。


   
   
  1. import argparse
  2. parser = argparse . ArgumentParser ( description = ’This is a PyMOTW sample program’ )

定义参数

argparse是一个全面的参数处理库。参数可以触发不同的动作,动作由 add_argument() 方法的 action 参数指定。 支持的动作包括保存参数(逐个地,或者作为列表的一部分),当解析到某参数时保存一个常量值(包括对布尔开关真/假值的特殊处理),统计某个参数出现的次数,以及调用一个回调函数。

默认的动作是保存参数值。在这种情况下,如果提供一个类型,那么在存储之前会先把该参数值转换成该类型。如果提供 dest 参数,参数值就保存为命令行参数解析时返回的命名空间对象中名为该 dest 参数值的一个属性。

解析一个命令行

定义了所有参数之后,你就可以给 parse_args() 传递一组参数字符串来解析命令行。默认情况下,参数是从 sys.argv[1:] 中获取,但你也可以传递自己的参数列表。选项是使用GNU/POSIX语法来处理的,所以在序列中选项和参数值可以混合。

parse_args() 的返回值是一个命名空间,包含传递给命令的参数。该对象将参数保存其属性,因此如果你的参数 dest"myoption",那么你就可以args.myoption 来访问该值。

简单示例

以下简单示例带有3个不同的选项:一个布尔选项(-a),一个简单的字符串选项(-b),以及一个整数选项(-c)。


   
   
  1. import argparse
  2. parser = argparse . ArgumentParser ( description = ’Short sample app’ )
  3. parser . add_argument ( ’-a’ , action = ”store_true” , default = False )
  4. parser . add_argument ( ’-b’ , action = ”store” , dest = ”b” )
  5. parser . add_argument ( ’-c’ , action = ”store” , dest = ”c” , type = int )
  6. print parser . parse_args ([ ’-a’ , ’-bval’ , ’-c’ , ’3’ ])

有几种方式传递值给单字符选项。以上例子使用了两种不同的形式,-bval-c val


   
   
  1. $ </span>python argparse_short.py</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Namespace<span class="o">(</span><span class="nv">a</span><span class="o">=</span>True, <span class="nv">b</span><span class="o">=</span><span class="s1"><span class="hljs-string">'val'</span></span>, <span class="nv">c</span><span class="o">=</span>3<span class="o">)</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></div><p>在输出中与<code>'c'</code>关联的值是一个整数,因为程序告诉<strong>ArgumentParser</strong>在保存之前先转换该参数。</p><p>“长”选项名字,即选项的名字多于一个字符,以相同的方式进行处理。</p><div class="highlight"> <pre onclick="hljs.copyCode(event)"><code class="python hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="kn"><span class="hljs-keyword">import</span></span> <span class="nn">argparse</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s"><span class="hljs-string">'Example with long option names'</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'--noarg'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store_true"</span></span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp"><span class="hljs-keyword">False</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'--witharg'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store"</span></span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s"><span class="hljs-string">"witharg"</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'--witharg2'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store"</span></span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s"><span class="hljs-string">"witharg2"</span></span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">int</span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">print</span></span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">([</span><span class="s"><span class="hljs-string">'--noarg'</span></span><span class="p">,</span> <span class="s"><span class="hljs-string">'--witharg'</span></span><span class="p">,</span> <span class="s"><span class="hljs-string">'val'</span></span><span class="p">,</span> <span class="s"><span class="hljs-string">'--withargs=3'</span></span><span class="p">])</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></div><p>结果也类似:</p><div class="highlight"> <pre onclick="hljs.copyCode(event)"><code class="bash hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="nv">$ python argparse_long.py
  2. Namespace ( noarg =True, witharg = ’val’, witharg2 =3 )

argparse区别于optparse的一个地方是对非选项参数值的处理。optparse只进行选项解析,而argparse是一个全面的命令行参数解析工具,也处理非选项参数。


   
   
  1. import argparse
  2. parser = argparse . ArgumentParser ( description = ’Example with non-optional arguments’ )
  3. parser . add_argument ( ’count’ , action = ”store” , type = int )
  4. parser . add_argument ( ’units’ , action = ”store” )
  5. print parser . parse_args ()

在这个例子中,“count”参数是一个整数,“units”参数存储为一个字符串。其中任意一个参数若没有在命令行中提供,或给定的值不能被转换为正确的类型,就会报告一个错误。


   
   
  1. $ </span>python argparse_arguments.py 3 inches</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Namespace<span class="o">(</span><span class="nv">count</span><span class="o">=</span>3, <span class="nv">units</span><span class="o">=</span><span class="s1"><span class="hljs-string">'inches'</span></span><span class="o">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="nv">$ python argparse_arguments.py some inches
  2. usage: argparse_arguments.py [-h ] count units
  3. argparse_arguments.py: error: argument count: invalid int value: ’some’
  4. $ </span>python argparse_arguments.py</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">usage: argparse_arguments.py <span class="o">[</span>-h<span class="o">]</span> count units</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">argparse_arguments.py: error: too few arguments</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></div><h3><a name="t5"></a>参数动作</h3><p>argparse内置6种动作可以在解析到一个参数时进行触发:</p><p><code>store</code> 保存参数值,可能会先将参数值转换成另一个数据类型。若没有显式指定动作,则默认为该动作。</p><p><code>store_const</code> 保存一个被定义为参数规格一部分的值,而不是一个来自参数解析而来的值。这通常用于实现非布尔值的命令行标记。</p><p><code>store_ture</code>/<code>store_false</code> 保存相应的布尔值。这两个动作被用于实现布尔开关。</p><p><code>append</code> 将值保存到一个列表中。若参数重复出现,则保存多个值。</p><p><code>append_const</code> 将一个定义在参数规格中的值保存到一个列表中。</p><p><code>version</code> 打印关于程序的版本信息,然后退出</p><div class="highlight"> <pre onclick="hljs.copyCode(event)"><code class="python hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="kn"><span class="hljs-keyword">import</span></span> <span class="nn">argparse</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">()</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-s'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">'store'</span></span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s"><span class="hljs-string">'simple_value'</span></span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">help</span><span class="o">=</span><span class="s"><span class="hljs-string">'Store a simple value'</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-c'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">'store_const'</span></span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s"><span class="hljs-string">'constant_value'</span></span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">const</span><span class="o">=</span><span class="s"><span class="hljs-string">'value-to-store'</span></span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">help</span><span class="o">=</span><span class="s"><span class="hljs-string">'Store a constant value'</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-t'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">'store_true'</span></span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp"><span class="hljs-keyword">False</span></span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">dest</span><span class="o">=</span><span class="s"><span class="hljs-string">'boolean_switch'</span></span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">help</span><span class="o">=</span><span class="s"><span class="hljs-string">'Set a switch to true'</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-f'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">'store_false'</span></span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp"><span class="hljs-keyword">False</span></span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">dest</span><span class="o">=</span><span class="s"><span class="hljs-string">'boolean_switch'</span></span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">help</span><span class="o">=</span><span class="s"><span class="hljs-string">'Set a switch to false'</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="19"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-a'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">'append'</span></span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s"><span class="hljs-string">'collection'</span></span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="20"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">default</span><span class="o">=</span><span class="p">[],</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="21"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">help</span><span class="o">=</span><span class="s"><span class="hljs-string">'Add repeated values to a list'</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="22"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="23"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-A'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">'append_const'</span></span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s"><span class="hljs-string">'const_collection'</span></span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="24"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">const</span><span class="o">=</span><span class="s"><span class="hljs-string">'value-1-to-append'</span></span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="25"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">default</span><span class="o">=</span><span class="p">[],</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="26"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">help</span><span class="o">=</span><span class="s"><span class="hljs-string">'Add different values to list'</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="27"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-B'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">'append_const'</span></span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s"><span class="hljs-string">'const_collection'</span></span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="28"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">const</span><span class="o">=</span><span class="s"><span class="hljs-string">'value-2-to-append'</span></span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="29"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">help</span><span class="o">=</span><span class="s"><span class="hljs-string">'Add different values to list'</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="30"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="31"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'--version'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">'version'</span></span><span class="p">,</span> <span class="n">version</span><span class="o">=</span><span class="s"><span class="hljs-string">'</span></span><span class="si"><span class="hljs-string">%(prog)s</span></span><span class="s"><span class="hljs-string"> 1.0'</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="32"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="33"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">results</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="34"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">print</span></span> <span class="s"><span class="hljs-string">'simple_value ='</span></span><span class="p">,</span> <span class="n">results</span><span class="o">.</span><span class="n">simple_value</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="35"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">print</span></span> <span class="s"><span class="hljs-string">'constant_value ='</span></span><span class="p">,</span> <span class="n">results</span><span class="o">.</span><span class="n">constant_value</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="36"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">print</span></span> <span class="s"><span class="hljs-string">'boolean_switch ='</span></span><span class="p">,</span> <span class="n">results</span><span class="o">.</span><span class="n">boolean_switch</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="37"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">print</span></span> <span class="s"><span class="hljs-string">'collection ='</span></span><span class="p">,</span> <span class="n">results</span><span class="o">.</span><span class="n">collection</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="38"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">print</span></span> <span class="s"><span class="hljs-string">'const_collection ='</span></span><span class="p">,</span> <span class="n">results</span><span class="o">.</span><span class="n">const_collection</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></div><div class="highlight"> <pre onclick="hljs.copyCode(event)"><code class="bash hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="nv">$ python argparse_action.py -h
  5. usage: argparse_action.py [-h ] [-s SIMPLE_VALUE ] [-c ] [-t ] [-f ]
  6. [-a COLLECTION ] [-A ] [-B ] [–version ]
  7. optional arguments:
  8. -h, – help show this help message and exit
  9. -s SIMPLE_VALUE Store a simple value
  10. -c Store a constant value
  11. -t Set a switch to true
  12. -f Set a switch to false
  13. -a COLLECTION Add repeated values to a list
  14. -A Add different values to list
  15. -B Add different values to list
  16. –version show program ’s version number and exit
  17. $ python argparse_action.py -s value</span></span><span class="hljs-string"></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="19"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="s1"><span class="hljs-string">simple_value = value</span></span><span class="hljs-string"></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="20"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="s1"><span class="hljs-string">constant_value = None</span></span><span class="hljs-string"></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="21"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="s1"><span class="hljs-string">boolean_switch = False</span></span><span class="hljs-string"></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="22"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="s1"><span class="hljs-string">collection = []</span></span><span class="hljs-string"></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="23"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="s1"><span class="hljs-string">const_collection = []</span></span><span class="hljs-string"></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="24"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="25"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="s1"><span class="hljs-string">$ python argparse_action.py -c
  18. simple_value = None
  19. constant_value = value-to-store
  20. boolean_switch = False
  21. collection = []
  22. const_collection = []
  23. $ python argparse_action.py -t</span></span><span class="hljs-string"></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="34"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="35"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="s1"><span class="hljs-string">simple_value = None</span></span><span class="hljs-string"></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="36"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="s1"><span class="hljs-string">constant_value = None</span></span><span class="hljs-string"></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="37"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="s1"><span class="hljs-string">boolean_switch = True</span></span><span class="hljs-string"></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="38"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="s1"><span class="hljs-string">collection = []</span></span><span class="hljs-string"></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="39"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="s1"><span class="hljs-string">const_collection = []</span></span><span class="hljs-string"></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="40"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="41"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="s1"><span class="hljs-string">$ python argparse_action.py -f
  24. simple_value = None
  25. constant_value = None
  26. boolean_switch = False
  27. collection = []
  28. const_collection = []
  29. $ python argparse_action.py -a one -a two -a three</span></span><span class="hljs-string"></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="50"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="51"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="s1"><span class="hljs-string">simple_value = None</span></span><span class="hljs-string"></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="52"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="s1"><span class="hljs-string">constant_value = None</span></span><span class="hljs-string"></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="53"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="s1"><span class="hljs-string">boolean_switch = False</span></span><span class="hljs-string"></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="54"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="s1"><span class="hljs-string">collection = ['</span></span>one<span class="s1"><span class="hljs-string">', '</span></span>two<span class="s1"><span class="hljs-string">', '</span></span>three<span class="s1"><span class="hljs-string">']</span></span><span class="hljs-string"></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="55"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="s1"><span class="hljs-string">const_collection = []</span></span><span class="hljs-string"></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="56"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="57"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="s1"><span class="hljs-string">$ python argparse_action.py -B -A
  30. simple_value = None
  31. constant_value = None
  32. boolean_switch = False
  33. collection = []
  34. const_collection = [‘value-2-to-append ’, ‘value-1-to-append ]
  35. $ </span></span><span class="hljs-string"><span class="hljs-string">python argparse_action.py --version</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="66"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-string"></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="67"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-string">argparse_action.py 1.0</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="68"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-string"></span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></div><h3><a name="t6"></a>选项前缀</h3><p>argparse选项的默认语法是基于Unix约定的,使用一个“-”前缀来表示命令行开关。argparse支持其他前缀,因此你可以使得你的程序遵照本地平台的默认语法(例如,在Window上使用“/”)或者遵循不同的约定。</p><div class="highlight"> <pre onclick="hljs.copyCode(event)"><code class="python hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="kn"><span class="hljs-keyword">import</span></span> <span class="nn">argparse</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s"><span class="hljs-string">'Change the option prefix charaters'</span></span><span class="p">,</span> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">prefix_chars</span><span class="o">=</span><span class="s"><span class="hljs-string">'-+/'</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-a'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store_false"</span></span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp"><span class="hljs-keyword">None</span></span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">help</span><span class="o">=</span><span class="s"><span class="hljs-string">'Turn A off'</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'+a'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store_true"</span></span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp"><span class="hljs-keyword">None</span></span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">help</span><span class="o">=</span><span class="s"><span class="hljs-string">'Turn A on'</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'//noarg'</span></span><span class="p">,</span> <span class="s"><span class="hljs-string">'++noarg'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store_true"</span></span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp"><span class="hljs-keyword">False</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">print</span></span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></div><p>将<strong>ArgumentParser</strong> 方法的<em>prefix_chars</em> 参数设置为一个字符串,该字符串包含所有允许用来表示选项的字符。需要理解的是虽然<em>prefix_chars</em>包含允许用于开关的字符,但单个参数定义只能使用一种给定的开关语法。这让你可以对使用不同前缀的选项是否是别名(比如独立于平台的命令行语法的情况)或替代选择(例如,使用“+”表明打开一个开发,“-”则为关闭一个开关)进行显式地控制。在上述例子中,<code>+a</code>和<code>-a</code>是不同的参数,<code>//noarg</code> 也可以 <code>++noarg</code> 提供,但不是 <code>--noarg</code>。</p><div class="highlight"> <pre onclick="hljs.copyCode(event)"><code class="python hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="err">$ python argparse_prefix_chars.py -h
  36. usage : argparse_prefix_chars . py [ - h ] [ - a ] [ + a ] [ // noarg ]
  37. Change the option prefix characters
  38. optional arguments
  39. - h , help show this help message and exit
  40. - a Turn A off
  41. + a Turn A on
  42. // noarg , ++ noarg
  43. $</span> <span class="n">python</span> <span class="n">argparse_prefix_chars</span><span class="o">.</span><span class="n">py</span> <span class="o">+</span><span class="n">a</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">Namespace</span><span class="p">(</span><span class="n">a</span><span class="o">=</span><span class="bp"><span class="hljs-keyword">True</span></span><span class="p">,</span> <span class="n">noarg</span><span class="o">=</span><span class="bp"><span class="hljs-keyword">False</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="err">$ python argparse_prefix_chars . py - a
  44. Namespace ( a = False , noarg = False )
  45. $</span> <span class="n">python</span> <span class="n">argparse_prefix_chars</span><span class="o">.</span><span class="n">py</span> <span class="o">//</span><span class="n">noarg</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="22"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="23"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">Namespace</span><span class="p">(</span><span class="n">a</span><span class="o">=</span><span class="bp"><span class="hljs-keyword">None</span></span><span class="p">,</span> <span class="n">noarg</span><span class="o">=</span><span class="bp"><span class="hljs-keyword">True</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="24"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="25"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="err">$ python argparse_prefix_chars . py ++ noarg
  46. Namespace ( a = None , noarg = True )
  47. $</span> <span class="n">python</span> <span class="n">argparse_prefix_chars</span><span class="o">.</span><span class="n">py</span> <span class="o">--</span><span class="n">noarg</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="30"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="31"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">usage</span><span class="p">:</span> <span class="n">argparse_prefix_chars</span><span class="o">.</span><span class="n">py</span> <span class="p">[</span><span class="o">-</span><span class="n">h</span><span class="p">]</span> <span class="p">[</span><span class="o">-</span><span class="n">a</span><span class="p">]</span> <span class="p">[</span><span class="o">+</span><span class="n">a</span><span class="p">]</span> <span class="p">[</span><span class="o">//</span><span class="n">noarg</span><span class="p">]</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="32"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">argparse_prefix_chars</span><span class="o">.</span><span class="n">py</span><span class="p">:</span> <span class="n">error</span><span class="p">:</span> <span class="n">unrecognized</span> <span class="n">arguments</span><span class="p">:</span> <span class="o">--</span><span class="n">noarg</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></div><h3><a name="t7"></a>参数来源</h3><p>目前为止所见的例子中,提供给解析器的参数列表来自于显式传递的一个列表,或隐式地从sys.argv获取的。显式传递列表在你使用argparse来处理类命令行但并不是来自命令行(比如来自一个配置文件)的指令之时比较有用。</p><div class="highlight"> <pre onclick="hljs.copyCode(event)"><code class="python hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="kn"><span class="hljs-keyword">import</span></span> <span class="nn">argparse</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="kn"><span class="hljs-keyword">from</span></span> <span class="nn">ConfigParser</span> <span class="kn"><span class="hljs-keyword">import</span></span> <span class="n">ConfigParser</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="kn"><span class="hljs-keyword">import</span></span> <span class="nn">shlex</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">./span&gt;<span class="n">ArgumentParser</span><span class="p">(</span><span class="n">description</span><span class="o">=</span><span class="s"><span class="hljs-string">'Short sample app'</span></span><span class="p">)</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-a'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store_true"</span></span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp"><span class="hljs-keyword">False</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-b'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store"</span></span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s"><span class="hljs-string">"b"</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-c'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store"</span></span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s"><span class="hljs-string">"c"</span></span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">int</span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">config</span> <span class="o">=</span> <span class="n">ConfigParser</span><span class="p">()</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">config</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="s"><span class="hljs-string">'argparse_witH_shlex.ini'</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">config_value</span> <span class="o">=</span> <span class="n">config</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s"><span class="hljs-string">'cli'</span></span><span class="p">,</span> <span class="s"><span class="hljs-string">'options'</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">print</span></span> <span class="s"><span class="hljs-string">'Config: '</span></span><span class="p">,</span> <span class="n">config_value</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">argument_list</span> <span class="o">=</span> <span class="n">shlex</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="n">config_value</span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">print</span></span> <span class="s"><span class="hljs-string">'Arg List:'</span></span><span class="p">,</span> <span class="n">argument_list</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="19"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">print</span></span> <span class="s"><span class="hljs-string">'Results:'</span></span><span class="p">,</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">(</span><span class="n">argument_list</span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="20"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></div><p>shlex使得切分存储在配置文件中的字符串非常容易。</p><div class="highlight"> <pre onclick="hljs.copyCode(event)"><code class="bash hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="nv">$ python argparse_with_shlex.py
  48. Config: -a -b 2
  49. Arg List: [ ’-a’, ’-b’, ’2’ ]
  50. Results: Namespace ( a =True, b = ’2’, c =None )

另一种自己处理配置文件的方法是使用fromfile_prefix_chars指定一个包含一组要待处理参数的输入文件来告诉argparse怎样识别参数。


   
   
  1. import argparse
  2. from ConfigParser import ConfigParser
  3. import shlex
  4. parser = argparse . ArgumentParser ( description = ’Short sample app’ ,
  5. fromfile_prefix_chars = ’@’
  6. )
  7. parser . add_argument ( ’-a’ , action = ”store_true” , default = False )
  8. parser . add_argument ( ’-b’ , action = ”store” , dest = ”b” )
  9. parser . add_argument ( ’-c’ , action = ”store” , dest = ”c” , type = int )
  10. print parser . parse_args ([ ’@argparse_fromfile_prefix_chars.txt’ ])

该示例代码在找到一个以@为前缀的参数时即停止往下读取,然后从以该参数命名的文件中查找更多的参数。例如,输入文件argparse_fromfile_prefix_chars.txt包含一系列参数,一行一个:


  
  
  1. -a
  2. -b
  3. 2

那么处理该文件产生的输出为:


  
  
  1. $ python argparse_fromfile_prefix_chars.py</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Namespace(a=<span class="hljs-keyword">True</span>, b=<span class="hljs-string">'2'</span>, c=<span class="hljs-keyword">None</span>)</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><h3><a name="t8"></a>自动生成选项</h3><p>经过配置argparse会自动添加选项用来生成帮助信息以及为你的应用程序显示版本信息。</p><p><strong>ArgumentParser</strong>的参数<em>add_help</em> 控制帮助信息相关的选项。</p><div class="highlight"> <pre οnclick="hljs.copyCode(event)"><code class="python hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="kn"><span class="hljs-keyword">import</span></span> <span class="nn">argparse</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">add_help</span><span class="o">=</span><span class="bp"><span class="hljs-keyword">True</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-a'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store_true"</span></span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp"><span class="hljs-keyword">False</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-b'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store"</span></span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s"><span class="hljs-string">"b"</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-c'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store"</span></span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s"><span class="hljs-string">"c"</span></span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">int</span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">print</span></span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></div><p>帮助选项(-h和–help)默认是添加的,但可以通过将<em>add_help</em>设置为false来禁用。</p><div class="highlight"> <pre οnclick="hljs.copyCode(event)"><code class="python hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="kn"><span class="hljs-keyword">import</span></span> <span class="nn">argparse</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">add_help</span><span class="o">=</span><span class="bp"><span class="hljs-keyword">False</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-a'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store_true"</span></span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp"><span class="hljs-keyword">False</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-b'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store"</span></span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s"><span class="hljs-string">"b"</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-c'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store"</span></span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s"><span class="hljs-string">"c"</span></span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">int</span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">print</span></span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></div><p>虽然<code>-h</code>和<code>--help</code>是事实上的请求帮助的标准选项名称,但一些应用或argparse的使用要么不需要提供帮助要么需要将这两个选项名称用于其他目标。</p><pre οnclick="hljs.copyCode(event)"><code class="hljs swift"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ python argparse_with_help.py -h
  2. usage: argparse_with_help.py [-h] [-a] [-b B] [- c C]
  3. optional arguments:
  4. -h, --help show this help message and exit
  5. -a
  6. -b B
  7. - c C
  8. $ python argparse_without_help.py -h</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">usage: argparse_without_help.py [-a] [-b <span class="hljs-type">B</span>] [-<span class="hljs-built_in">c</span> <span class="hljs-type">C</span>]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">argparse_without_help.py: error: unrecognized arguments: -h</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>当在<strong>ArgumentParser</strong>构造方法设置<em>版本</em>后,就会添加版本选项(<code>-v</code>和<code>--version</code>)。</p><div class="highlight"> <pre οnclick="hljs.copyCode(event)"><code class="python hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="kn"><span class="hljs-keyword">import</span></span> <span class="nn">argparse</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">version</span><span class="o">=</span><span class="s"><span class="hljs-string">'1.0'</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-a'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store_true"</span></span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp"><span class="hljs-keyword">False</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-b'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store"</span></span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s"><span class="hljs-string">"b"</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-c'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store"</span></span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s"><span class="hljs-string">"c"</span></span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">int</span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">print</span></span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">print</span></span> <span class="s"><span class="hljs-string">'This is not printed'</span></span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></div><p>两种形式的选项爱那个都会打印程序的版本字符串,然后立即退出程序。</p><pre οnclick="hljs.copyCode(event)"><code class="hljs cpp"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ python argparse_with_version.py -h
  9. usage: argparse_with_version.py [-h] [-v] [-a] [-b B] [-c C]
  10. optional arguments:
  11. -h, --help show this help message and exit
  12. -v, --version show program's version number and exit
  13. -a
  14. -b B
  15. -c C
  16. $ python argparse_with_version.py -v</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-number">1.0</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><h3><a name="t9"></a>解析器组</h3><p>argparse包含若干特性用于组织你的参数解析器,使得实现更为简单,也能提高输出帮助信息的可用性。</p><p><strong>共享解析器规则</strong></p><p>我们常常需要实现一套命令行程序,这些程序都带一组参数,只是在某些方面有特殊化。例如,如果所有程序都需要在用户进行任何实际的操作之前对用户进行认证,那么它们就都需要支持<code>--user</code>和<code>--password</code>选项。你可以共享的选项来定义一个“父母”解析器,然后令单个程序的解析器从该“父母”解析器继承共享选项,这样就不必显式为每个<strong>ArgumentParser</strong>添加共享选项。</p><p>第一步是以共享的参数定义建立“父母”解析器。由于“父母”解析器的后代使用者会添加相同的帮助选项,从而会引发一个异常,所以在基础解析器中我们关闭自动帮助选项生成。</p><div class="highlight"> <pre οnclick="hljs.copyCode(event)"><code class="python hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="kn"><span class="hljs-keyword">import</span></span> <span class="nn">argparse</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">add_help</span><span class="o">=</span><span class="bp"><span class="hljs-keyword">False</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'--user'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store"</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'--password'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store"</span></span><span class="p">)</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></div><p>接下来,以<em>父母解析器</em>集创建另一个解析器:</p><div class="highlight"> <pre οnclick="hljs.copyCode(event)"><code class="python hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="kn"><span class="hljs-keyword">import</span></span> <span class="nn">argparse</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="kn"><span class="hljs-keyword">import</span></span> <span class="nn">argparse_parent_base</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">parents</span><span class="o">=</span><span class="p">[</span><span class="n">argparse_parent_base</span><span class="o">.</span><span class="n">parser</span><span class="p">])</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'--local-arg'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store_true"</span></span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp"><span class="hljs-keyword">False</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">print</span></span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></div><p>得到的程序带有三个选项:</p><pre οnclick="hljs.copyCode(event)"><code class="hljs sql"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ python argparse_uses_parent.py -h
  17. usage: argparse_uses_parent.py [-h] [ --user USER] [--password PASSWORD]
  18. [ --local-arg]
  19. optional arguments:
  20. -h, --help show this help message and exit
  21. --user USER
  22. --password PASSWORD
  23. --local-arg

冲突的选项

前一个例子指出以相同的参数名字为一个解析器添加两个参数处理器会引发一个异常。可以通过传递一个conflict_handler来改变冲突消除行为。argparse有两个内置的冲突处理器error(默认)和resolveresolve会基于冲突选项的添加顺序来选择一个参数处理器。


   
   
  1. import argparse
  2. parser = argparse . ArgumentParser ( conflict_handler = ’resolve’ )
  3. parser . add_argument ( ’-a’ , action = ”store” )
  4. parser . add_argument ( ’-b’ , action = ”store” , help = ”Short alone” )
  5. parser . add_argument ( ’–long-b’ , ’-b’ , action = ”store” , help = ”Long and short together” )
  6. print parser . parse_args ([ ’-h’ ])

由于最后一个处理器所给定的参数名已被使用,那么本例中独立选项-b将被--long-b的别名所覆盖。


  
  
  1. $ python argparse_conflict_handler_resolve.py</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">usage: argparse_conflict_handler_resolve.py [-h] [-a A] [--<span class="hljs-built_in">long</span>-b LONG_B]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">optional</span> arguments:</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> -h, --help show this help message <span class="hljs-keyword">and</span> <span class="hljs-keyword">exit</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> -a A</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> --<span class="hljs-built_in">long</span>-b LONG_B, -b LONG_B</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">Long</span> <span class="hljs-keyword">and</span> <span class="hljs-built_in">short</span> together</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>切换<strong>add_argument()</strong>的调用顺序就可以启用独立的选项:</p><div class="highlight"> <pre onclick="hljs.copyCode(event)"><code class="python hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="kn"><span class="hljs-keyword">import</span></span> <span class="nn">argparse</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">conflict_handler</span><span class="o">=</span><span class="s"><span class="hljs-string">'resolve'</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-a'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store"</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'--long-b'</span></span><span class="p">,</span> <span class="s"><span class="hljs-string">'-b'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store"</span></span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s"><span class="hljs-string">'Long and short together'</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-b'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store"</span></span><span class="p">,</span> <span class="n">help</span><span class="o">=</span><span class="s"><span class="hljs-string">'Short alone'</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">print</span></span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">([</span><span class="o">-</span><span class="n">h</span><span class="p">])</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></div><p>现在两个选项可以一起使用了。</p><pre onclick="hljs.copyCode(event)"><code class="hljs vbnet"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ python argparse_conflict_handler_resolve2.py
  2. usage: argparse_conflict_handler_resolve2.py [-h] [-a A] [-- long-b LONG_B] [-b B]
  3. optional arguments:
  4. -h, --help show this help message and exit
  5. -a A
  6. -- long-b LONG_B Long and short together
  7. -b B Short alone

参数群组

argparse能将参数定义组合成“群组”。默认情况下是使用两个群组,一个是选项的群组,另一个是必须的与位置相关的参数群组。


   
   
  1. import argparse
  2. parser = argparse . ArgumentParser ( description = ’Short sample app’ )
  3. parser . add_argument ( ’–optional’ , action = ”store_true” , default = False )
  4. parser . add_argument ( ’positional’ , action = ”store” )
  5. print parser . parse_args ()

群组在输出的帮助信息中显示为分开的“与位置相关的参数”和“可选参数”两个部分:


  
  
  1. $ python argparse_default_grouping.py</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">usage: argparse_default_grouping.py [-h] [--<span class="hljs-keyword">optional</span>] positional</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-built_in">Short</span> sample app</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">positional arguments:</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> positional</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">optional</span> arguments:</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> -h, --help show this help message <span class="hljs-keyword">and</span> <span class="hljs-keyword">exit</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> --<span class="hljs-keyword">optional</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>你可以调整群组来提高帮助信息中群组的逻辑性,这样相关选项或值能记录在一起。可以使用自定义群组来重写之前的共享选项的示例,如此在帮助信息中身份认证的选项就可以显示在一起。</p><p>在基础解析器中使用<strong>add_argument_group()</strong>来创建一个“身份认证”群组,然后逐个添加身份认证相关的选项到该群组。</p><div class="highlight"> <pre onclick="hljs.copyCode(event)"><code class="python hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="kn"><span class="hljs-keyword">import</span></span> <span class="nn">argparse</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span> <span class="o">=</span> <span class="n">argparser</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">add_help</span><span class="o">=</span><span class="bp"><span class="hljs-keyword">False</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">group</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">add_argument_group</span><span class="p">(</span><span class="s"><span class="hljs-string">'authentication'</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">group</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'--user'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store"</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">group</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'--password'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store"</span></span><span class="p">)</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></div><p>与之前一样,程序使用基于群组的父母解析器列表作为<em>parents</em>的值。</p><div class="highlight"> <pre onclick="hljs.copyCode(event)"><code class="python hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="kn"><span class="hljs-keyword">import</span></span> <span class="nn">argparse</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="kn"><span class="hljs-keyword">import</span></span> <span class="nn">argparse_parent_with_group</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">(</span><span class="n">parents</span><span class="o">=</span><span class="p">[</span><span class="n">argparse_parent_with_group</span><span class="o">.</span><span class="n">parser</span><span class="p">])</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'--local-arg'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="s"><span class="hljs-string">"store_true"</span></span><span class="p">,</span> <span class="n">default</span><span class="o">=</span><span class="bp"><span class="hljs-keyword">False</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">print</span></span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></div><p>现在输出的帮助信息一起显示身份认证选项。</p><pre onclick="hljs.copyCode(event)"><code class="hljs delphi"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ python argparse_uses_parent_with_group.py -h
  2. usage: argparse_uses_parent_with_group.py [-h] [--user USER] [--password PASSWORD] [-- local-arg]
  3. optional arguments:
  4. -h, --help show this message and exit
  5. -- local-arg
  6. authentication:
  7. --user USER
  8. --password PASSWORD

互斥选项

定义互斥的选项是选项分组特性的一个特例,使用add_mutually_exclusive_group()而不是add_argument_group()


   
   
  1. import argparse
  2. parser = argparse . ArgumentParser ()
  3. group = parser . add_mutually_exclusive_group ()
  4. group . add_argument ( ’-a’ , action = ’store_true’ )
  5. group . add_argument ( ’-b’ , action = ”store_true” )
  6. print parser . parse_args ()

argparse会为你强制执行互斥性,因此一次使用仅能给出该群组的选项中的一个。


  
  
  1. $ python argparse_mutually_exclusive.py -h</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">usage: argparse_mutually_exclusive.py [-h] [-a | -b]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">optional</span> arguments:</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> -h, --help show this help message <span class="hljs-keyword">and</span> <span class="hljs-keyword">exit</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> -a</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> -b</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ python argparse_mutually_exclusive.py -a
  2. Namespace(a= True, b= False)
  3. $ python argparse_mutually_exclusive.py -b</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-keyword">Namespace</span>(a=<span class="hljs-literal">False</span>, b=<span class="hljs-literal">True</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ python argparse_mutually_exclusive.py -a -b
  4. usage: argparse_mutually_exclusive.py [-h] [-a | -b]
  5. argparse_mutually_exclusive.py: error: argument -b: not allowed with argument -a

嵌套解析器

上述的父母解析器方式是在相关命令之间共享选项的方式之一。另一种方式是将多个命令组合进一个程序中,使用子解析器来处理命令行的每个部分。就像svnhg,以及其他带有多个命令行行为或子命令的程序那样。

一个用于处理文件系统目录的程序可能会像这样定义命令用于创建、删除、以及列出一个目录的内容:


   
   
  1. import argparse
  2. parser = argparse . ArgumentParser ()
  3. subparsers = parser . add_subparsers ( help = ’commands’ )
  4. # A list command
  5. list_parser = subparsers . add_parser ( ’list’ , help = ’List contents’ )
  6. list_parser . add_argument ( ’dirname’ , action = ’store’ , help = ’Directory to list’ )
  7. # A create command
  8. create_parser = subparsers . add_parser ( ’create’ , help = ’Create a directory’ )
  9. create_parser . add_argument ( ’dirname’ , action = ’store’ , help = ’New directory to create’ )
  10. create_parser . add_argument ( ’–read-only’ , default = False , action = ’store_true’ ,
  11. help = ’Set permissions to prevent writing to the directory’ )
  12. # A delete command
  13. delete_parser = subparsers . add_parser ( ’delete’ , help = ’Remove a directory’ )
  14. delete_parser . add_argument ( ’dirname’ , action = ’store’ , help = ’The directory to remove’ )
  15. delete_parser . add_argument ( ’–recursive’ , ’-r’ , default = False , action = ’store_true’ ,
  16. help = ’Remove the contents of the directory, too’ )
  17. print parser . parse_args ()

输出的帮助信息显示作为“命令”的命名子解析器能够在命令行中作为位置参数进行指定。


  
  
  1. $ python argparse_subparsers.py -h</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">usage: argparse_subparsers.py [-h] {<span class="hljs-built_in">list</span>, create, <span class="hljs-keyword">delete</span>} ...</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">positional arguments:</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> {<span class="hljs-built_in">list</span>, create, <span class="hljs-keyword">delete</span>} commands</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-built_in">list</span> List contents</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> create Create a directory</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="hljs-keyword">delete</span> Remove a directory</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">optional arguments:</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> -h, --help show <span class="hljs-keyword">this</span> help message <span class="hljs-keyword">and</span> <span class="hljs-built_in">exit</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>每个子解析器也有自己的帮助信息,描述那个命令的参数和选项。</p><pre οnclick="hljs.copyCode(event)"><code class="hljs sql"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ python argparse_subparsers.py create -h
  2. usage: argparse_subparsers.py create [-h] [ --read-only] dirname
  3. positional arguments:
  4. dirname New directory to create
  5. optional arguments:
  6. -h, --help show this help message and exit
  7. --read-only Set permissions to prevent writing to the directory

参数被解析后,parse_args()返回的Namespace对象仅包含与指定的命令相关的值。


  
  
  1. $ python argparse_subparsers.py <span class="hljs-keyword">delete</span> -r foo</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Namespace(dirname=<span class="hljs-string">'foo'</span>, <span class="hljs-keyword">recursive</span>=<span class="hljs-literal">True</span>)</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><h3><a name="t10"></a>高级参数处理</h3><p>至今为止的示例展示了简单的布尔标识、字符串或数字参数选项、以及位置参数。对于变长参数列表、枚举类型数据、以及常量,argparse支持复杂的参数规格。</p><p><strong>可变形参列表</strong></p><p>你可以配置单个参数的定义使其能够匹配所解析的命令行的多个参数。根据需要或期望的参数个数,设置<em>nargs</em>为这些标识值之一:</p><pre onclick="hljs.copyCode(event)"><code class="hljs diff"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">值 含义</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">N 参数的绝对个数(例如:3)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">? 0或1个参数</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">* 0或所有参数</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="hljs-addition">+ 所有,并且至少一个参数</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><div class="highlight"> <pre onclick="hljs.copyCode(event)"><code class="python hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="kn"><span class="hljs-keyword">import</span></span> <span class="nn">argparse</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">()</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'--three'</span></span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="mi"><span class="hljs-number">3</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'--optional'</span></span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s"><span class="hljs-string">'?'</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'--all'</span></span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s"><span class="hljs-string">'*'</span></span><span class="p">,</span> <span class="n">dest</span><span class="o">=</span><span class="s"><span class="hljs-string">'all'</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'--one-or-more'</span></span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s"><span class="hljs-string">'+'</span></span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">print</span></span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></div><p>解析器强制执行参数计数指令,生成一个精确的语法图作为命令帮助文本的一部分。</p><pre onclick="hljs.copyCode(event)"><code class="hljs python"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ python argparse_nargs.py -h
  2. usage: argparse_nargs.py [-h] [--three THREE THREE THREE]
  3. [--optional [OPTIONAL]] [--all [ALL [ALL ...]]]
  4. [--one- or-more ONE_OR_MORE [ONE_OR_MORE ...]]
  5. optional arguments:
  6. -h, --help show this help message and exit
  7. --three THREE THREE THREE
  8. --optional [OPTIONAL]
  9. --all [ALL [ALL ...]]
  10. --one- or-more ONE_OR_MORE [ONE_OR_MORE ...]
  11. $ python argparse_nargs.py</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Namespace(all=<span class="hljs-keyword">None</span>, one_or_more=<span class="hljs-keyword">None</span>, optional=<span class="hljs-keyword">None</span>, three=<span class="hljs-keyword">None</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ python argparse_nargs.py --three
  12. usage: argparse_nargs.py [-h] [--three THREE THREE THREE]
  13. [--optional [OPTIONAL]] [--all [ALL [ALL ...]]]
  14. [--one- or-more ONE_OR_MORE [ONE_OR_MORE ...]]
  15. argparse_nargs.py: error: argument --three: expected 3 argument(s)
  16. $ python argparse_nargs.py --three a b c</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="26"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="27"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Namespace(all=<span class="hljs-keyword">None</span>, one_or_more=<span class="hljs-keyword">None</span>, optional=<span class="hljs-keyword">None</span>, three=[<span class="hljs-string">'a'</span>, <span class="hljs-string">'b'</span>, <span class="hljs-string">'c'</span>])</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="28"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="29"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ python argparse_nargs.py --optional
  17. Namespace(all= None, one_or_more= None, optional= None, three= None)
  18. $ python argparse_nargs.py --optional with_value</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="34"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="35"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Namespace(all=<span class="hljs-keyword">None</span>, one_or_more=<span class="hljs-keyword">None</span>, optional=<span class="hljs-string">'with_value'</span>, three=<span class="hljs-keyword">None</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="36"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="37"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ python argparse_nargs.py --all with multiple values
  19. Namespace(all=[ 'with', 'multiple', 'values'], one_or_more= None, optional= None, three= None)
  20. $ python argparse_nargs.py --one-<span class="hljs-keyword">or</span>-more with_value</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="42"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="43"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Namespace(all=<span class="hljs-keyword">None</span>, one_or_more=[<span class="hljs-string">'with_value'</span>], optional=<span class="hljs-keyword">None</span>, three=<span class="hljs-keyword">None</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="44"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="45"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ python argparse_nargs.py --one- or-more with multiple values
  21. Namespace(all= None, one_or_more=[ 'with', 'multiple', 'values'], optional= None, three= None)
  22. $ python argparse_nargs.py --one-<span class="hljs-keyword">or</span>-more</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="50"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="51"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">usage: argparse_nargs.py [-h] [--three THREE THREE THREE]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="52"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> [--optional [OPTIONAL]] [--all [ALL [ALL ...]]]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="53"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> [--one-<span class="hljs-keyword">or</span>-more ONE_OR_MORE [ONE_OR_MORE ...]]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="54"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">argparse_nargs.py: error: argument --one-<span class="hljs-keyword">or</span>-more: expected at least one argument</div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p><strong>参数类型</strong></p><p>argparse将所有参数值都看作是字符串,除非你告诉它将字符串转换成另一种数据类型。<strong>add_argument()</strong>的<em>type</em>参数以一个转换函数作为值,被<strong>ArgumentParser</strong>用来将参数值从一个字符串转换成另一种数据类型。</p><div class="highlight"> <pre onclick="hljs.copyCode(event)"><code class="python hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="kn"><span class="hljs-keyword">import</span></span> <span class="nn">argparse</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">()</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-i'</span></span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">int</span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-f'</span></span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'--file'</span></span><span class="p">,</span> <span class="nb">type</span><span class="o">=</span><span class="nb">file</span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">try</span></span><span class="p">:</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="k"><span class="hljs-keyword">print</span></span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">except</span></span> <span class="ne">IOError</span><span class="p">,</span> <span class="n">msg</span><span class="p">:</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">parser</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">msg</span><span class="p">))</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></div><p>任何需要单个字符串参数的可调用对象都可以传递给<em>type</em>,包含内置类型如<strong>int()</strong>, <strong>float()</strong>, 以及<strong>file()</strong>。</p><pre onclick="hljs.copyCode(event)"><code class="hljs python"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ python argparse_type.py -i 1
  23. Namespace(f= None, file= None, i= 1)
  24. $ python argparse_type.py -f <span class="hljs-number">3.14</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Namespace(f=<span class="hljs-number">3.14</span>, file=<span class="hljs-keyword">None</span>, i=<span class="hljs-keyword">None</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ python argparse_type.py --file argparse_type.py
  25. Namespace(f= None, file=<open file 'argparse_type.py', mode 'r' at 0x1004de270>, i= None)

如果类型转换失败,argparse会引发一个异常。TypeErrorValueError会被自动捕获,并为用户转换为一个简单的错误消息。其他异常,如下面一个例子中输入文件不存在,则其IOError必须由调用者来处理。


  
  
  1. $ python argparse_type.py -i a</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">usage: argparse_type.py [-h] [-i I] [-f F] [--<span class="hljs-keyword">file</span> <span class="hljs-keyword">FILE</span>]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">argparse_type.py: error: argument -i: invalid int value: <span class="hljs-string">'a'</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ python argparse_type.py -f 3.14. 15
  2. usage: argparse_type.py [-h] [-i I] [-f F] [-- file FILE]
  3. argparse_type.py: error: argument -f: invalid float value: '3.14.15'
  4. $ python argparse_type.py --<span class="hljs-keyword">file</span> does_not_exist.txt</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">usage: argparse_type.py [-h] [-i I] [-f F] [--<span class="hljs-keyword">file</span> <span class="hljs-keyword">FILE</span>]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">argparse_type.py: error: [Errno <span class="hljs-number">2</span>] No such <span class="hljs-keyword">file</span> <span class="hljs-keyword">or</span> directory: <span class="hljs-string">'does_not_exist.txt'</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p>要想将一个输入参数限制为一个预定义集中的某个值,则使用<em>choices</em>参数。</p><div class="highlight"> <pre οnclick="hljs.copyCode(event)"><code class="python hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="kn"><span class="hljs-keyword">import</span></span> <span class="nn">argparse</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">()</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'--mode'</span></span><span class="p">,</span> <span class="n">choices</span><span class="o">=</span><span class="p">(</span><span class="s"><span class="hljs-string">'read-only'</span></span><span class="p">,</span> <span class="s"><span class="hljs-string">'read-write'</span></span><span class="p">))</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">print</span></span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">()</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></div><p>如果<code>--mode</code>的参数值不是所允许的值中的一个,就会产生一个错误并停止执行。</p><pre οnclick="hljs.copyCode(event)"><code class="hljs perl"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ python argparse_choices.py -h
  5. usage: argparse_choices.py [-h] [--mode { read-only, read- write}]
  6. optional arguments:
  7. -h, --help show this help message and exit
  8. --mode { read-only, read- write}
  9. $ python argparse_choices.py --mode <span class="hljs-keyword">read</span>-only</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">Namespace(mode=<span class="hljs-string">'read-only'</span>)</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ python argparse_choices.py --mode invalid
  10. usage: argparse_choices.py [-h] [--mode { read-only, read- write}]
  11. argparse_choices.py: error: argument --mode: invalid choice: 'invalid'
  12. (choose from 'read-only', 'read-write')

文件参数

虽然文件对象可以单个字符串参数值来实例化,但并不允许你指定访问模式。FileType让你能够更加灵活地指定某个参数应该是个文件,包括其访问模式和缓冲区大小。


   
   
  1. import argparse
  2. parser = argparse . ArgumentParser ()
  3. parser . add_argument ( ’-i’ , metavar = ’in-file’ , type = argparse . FileType ( ’rt’ ))
  4. parser . add_argument ( ’-o’ , metavar = ’out-file’ , type = argparse . FileType ( ’wt’ ))
  5. try :
  6. results = parser . parse_args ()
  7. print ’Input file:’ , results . i
  8. print ’Output file:’ , results . o
  9. except IOError , msg :
  10. parser . error ( str ( msg ))

上例中与参数名关联的值是一个打开文件句柄。在使用完该文件后应自己负责关闭该文件。


  
  
  1. $ python argparse_FileType.py -h</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">usage: argparse_FileType.py [-h] [-i <span class="hljs-keyword">in</span>-<span class="hljs-keyword">file</span>] [-o <span class="hljs-keyword">out</span>-<span class="hljs-keyword">file</span>]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">optional arguments:</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">-h, --help show this help <span class="hljs-keyword">message</span> <span class="hljs-keyword">and</span> <span class="hljs-keyword">exit</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">-i <span class="hljs-keyword">in</span>-<span class="hljs-keyword">file</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">-o <span class="hljs-keyword">out</span>-<span class="hljs-keyword">file</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ python argparse_FileType.py -i argparse_FileType.py -o temporary_file.\
  2. txt
  3. Input file: <open file 'argparse_FileType.py', mode 'rt' at 0x1004de270>
  4. Output file: <open file 'temporary_file.txt', mode 'wt' at 0x1004de300>
  5. $ python argparse_FileType.py -i no_such_file.txt</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">usage: argparse_FileType.py [-h] [-i <span class="hljs-keyword">in</span>-<span class="hljs-keyword">file</span>] [-o <span class="hljs-keyword">out</span>-<span class="hljs-keyword">file</span>]</div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="19"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">argparse_FileType.py: error: argument -i: can<span class="hljs-string">'t open '</span>no_such_file.txt<span class="hljs-string">': [Errno 2] No such file or directory: '</span>no_such_file.txt<span class="hljs-string">'</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre><p><strong>自定义动作</strong></p><p>除了前面描述的内置动作之外,你也可以提供一个实现了Action API的对象来自定义动作。作为<em>action</em>传递给<strong>add_argument()</strong>的对象应接受描述所定义形参的实参,并返回一个可调用对象,作为<em>parser</em>的实参来处理形参,<em>namespace</em>存放解析的结果、参数值,以及触发动作的<em>option_string</em>。</p><p>argparse提供了一个<strong>Action</strong>类作为要定义的新动作的基类。构造方法是处理参数定义的,所以你只要在子类中覆盖<strong><strong>call</strong>()</strong>。</p><div class="highlight"> <pre οnclick="hljs.copyCode(event)"><code class="python hljs"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="kn"><span class="hljs-keyword">import</span></span> <span class="nn">argparse</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="2"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="3"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-class"><span class="hljs-keyword">class</span></span></span><span class="hljs-class"> </span><span class="nc"><span class="hljs-class"><span class="hljs-title">CustomAction</span></span></span><span class="p"><span class="hljs-class"><span class="hljs-params">(</span></span></span><span class="n"><span class="hljs-class"><span class="hljs-params">argparse</span></span></span><span class="o"><span class="hljs-class"><span class="hljs-params">.</span></span></span><span class="n"><span class="hljs-class"><span class="hljs-params">Action</span></span></span><span class="p"><span class="hljs-class"><span class="hljs-params">)</span>:</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="4"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="k"><span class="hljs-function"><span class="hljs-keyword">def</span></span></span><span class="hljs-function"> </span><span class="nf"><span class="hljs-function"><span class="hljs-title">__init__</span></span></span><span class="p"><span class="hljs-function"><span class="hljs-params">(</span></span></span><span class="bp"><span class="hljs-function"><span class="hljs-params">self</span></span></span><span class="p"><span class="hljs-function"><span class="hljs-params">,</span></span></span><span class="hljs-function"><span class="hljs-params"></span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="5"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n"><span class="hljs-function"><span class="hljs-params">option_strings</span></span></span><span class="p"><span class="hljs-function"><span class="hljs-params">,</span></span></span><span class="hljs-function"><span class="hljs-params"></span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="6"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n"><span class="hljs-function"><span class="hljs-params">dest</span></span></span><span class="p"><span class="hljs-function"><span class="hljs-params">,</span></span></span><span class="hljs-function"><span class="hljs-params"></span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="7"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n"><span class="hljs-function"><span class="hljs-params">nargs</span></span></span><span class="o"><span class="hljs-function"><span class="hljs-params">=</span></span></span><span class="bp"><span class="hljs-function"><span class="hljs-params">None</span></span></span><span class="p"><span class="hljs-function"><span class="hljs-params">,</span></span></span><span class="hljs-function"><span class="hljs-params"></span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="8"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n"><span class="hljs-function"><span class="hljs-params">const</span></span></span><span class="o"><span class="hljs-function"><span class="hljs-params">=</span></span></span><span class="bp"><span class="hljs-function"><span class="hljs-params">None</span></span></span><span class="p"><span class="hljs-function"><span class="hljs-params">,</span></span></span><span class="hljs-function"><span class="hljs-params"></span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="9"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n"><span class="hljs-function"><span class="hljs-params">default</span></span></span><span class="o"><span class="hljs-function"><span class="hljs-params">=</span></span></span><span class="bp"><span class="hljs-function"><span class="hljs-params">None</span></span></span><span class="p"><span class="hljs-function"><span class="hljs-params">,</span></span></span><span class="hljs-function"><span class="hljs-params"></span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="10"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="nb"><span class="hljs-function"><span class="hljs-params">type</span></span></span><span class="o"><span class="hljs-function"><span class="hljs-params">=</span></span></span><span class="bp"><span class="hljs-function"><span class="hljs-params">None</span></span></span><span class="p"><span class="hljs-function"><span class="hljs-params">,</span></span></span><span class="hljs-function"><span class="hljs-params"></span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="11"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n"><span class="hljs-function"><span class="hljs-params">choices</span></span></span><span class="o"><span class="hljs-function"><span class="hljs-params">=</span></span></span><span class="bp"><span class="hljs-function"><span class="hljs-params">None</span></span></span><span class="p"><span class="hljs-function"><span class="hljs-params">,</span></span></span><span class="hljs-function"><span class="hljs-params"></span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="12"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n"><span class="hljs-function"><span class="hljs-params">required</span></span></span><span class="o"><span class="hljs-function"><span class="hljs-params">=</span></span></span><span class="bp"><span class="hljs-function"><span class="hljs-params">False</span></span></span><span class="p"><span class="hljs-function"><span class="hljs-params">,</span></span></span><span class="hljs-function"><span class="hljs-params"></span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="13"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n"><span class="hljs-function"><span class="hljs-params">help</span></span></span><span class="o"><span class="hljs-function"><span class="hljs-params">=</span></span></span><span class="bp"><span class="hljs-function"><span class="hljs-params">None</span></span></span><span class="p"><span class="hljs-function"><span class="hljs-params">,</span></span></span><span class="hljs-function"><span class="hljs-params"></span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="14"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n"><span class="hljs-function"><span class="hljs-params">metavar</span></span></span><span class="o"><span class="hljs-function"><span class="hljs-params">=</span></span></span><span class="bp"><span class="hljs-function"><span class="hljs-params">None</span></span></span><span class="p"><span class="hljs-function"><span class="hljs-params">)</span>:</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="15"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">argparse</span><span class="o">.</span><span class="n">Action</span><span class="o">.</span><span class="n">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="16"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">option_strings</span><span class="o">=</span><span class="n">option_strings</span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="17"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">dest</span><span class="o">=</span><span class="n">dest</span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="18"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">nargs</span><span class="o">=</span><span class="n">nargs</span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="19"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">const</span><span class="o">=</span><span class="n">const</span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="20"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">default</span><span class="o">=</span><span class="n">default</span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="21"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="nb">type</span><span class="o">=</span><span class="nb">type</span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="22"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">choices</span><span class="o">=</span><span class="n">choices</span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="23"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">required</span><span class="o">=</span><span class="n">required</span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="24"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">help</span><span class="o">=</span><span class="n">help</span><span class="p">,</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="25"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">metavar</span><span class="o">=</span><span class="n">metavar</span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="26"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="k"><span class="hljs-keyword">print</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="27"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="k"><span class="hljs-keyword">print</span></span> <span class="s"><span class="hljs-string">'Initializing CustomAction'</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="28"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="k"><span class="hljs-keyword">for</span></span> <span class="n">name</span><span class="p">,</span><span class="n">value</span> <span class="ow"><span class="hljs-keyword">in</span></span> <span class="nb">sorted</span><span class="p">(</span><span class="nb">locals</span><span class="p">()</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="29"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="k"><span class="hljs-keyword">if</span></span> <span class="n">name</span> <span class="o">==</span> <span class="s"><span class="hljs-string">'self'</span></span> <span class="ow"><span class="hljs-keyword">or</span></span> <span class="n">value</span> <span class="ow"><span class="hljs-keyword">is</span></span> <span class="bp"><span class="hljs-keyword">None</span></span><span class="p">:</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="30"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="k"><span class="hljs-keyword">continue</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="31"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="k"><span class="hljs-keyword">print</span></span> <span class="s"><span class="hljs-string">' </span></span><span class="si"><span class="hljs-string">%s</span></span><span class="s"><span class="hljs-string"> = </span></span><span class="si"><span class="hljs-string">%r</span></span><span class="s"><span class="hljs-string">'</span></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></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="32"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="k"><span class="hljs-keyword">return</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="33"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="34"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="k"><span class="hljs-function"><span class="hljs-keyword">def</span></span></span><span class="hljs-function"> </span><span class="nf"><span class="hljs-function"><span class="hljs-title">__call__</span></span></span><span class="p"><span class="hljs-function"><span class="hljs-params">(</span></span></span><span class="bp"><span class="hljs-function"><span class="hljs-params">self</span></span></span><span class="p"><span class="hljs-function"><span class="hljs-params">,</span></span></span><span class="hljs-function"><span class="hljs-params"> </span></span><span class="n"><span class="hljs-function"><span class="hljs-params">parser</span></span></span><span class="p"><span class="hljs-function"><span class="hljs-params">,</span></span></span><span class="hljs-function"><span class="hljs-params"> </span></span><span class="n"><span class="hljs-function"><span class="hljs-params">namespace</span></span></span><span class="p"><span class="hljs-function"><span class="hljs-params">,</span></span></span><span class="hljs-function"><span class="hljs-params"> </span></span><span class="n"><span class="hljs-function"><span class="hljs-params">values</span></span></span><span class="p"><span class="hljs-function"><span class="hljs-params">,</span></span></span><span class="hljs-function"><span class="hljs-params"> </span></span><span class="n"><span class="hljs-function"><span class="hljs-params">option_string</span></span></span><span class="o"><span class="hljs-function"><span class="hljs-params">=</span></span></span><span class="bp"><span class="hljs-function"><span class="hljs-params">None</span></span></span><span class="p"><span class="hljs-function"><span class="hljs-params">)</span>:</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="35"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="k"><span class="hljs-keyword">print</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="36"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="k"><span class="hljs-keyword">print</span></span> <span class="s"><span class="hljs-string">'Processing CustomAction for "</span></span><span class="si"><span class="hljs-string">%s</span></span><span class="s"><span class="hljs-string">"'</span></span> <span class="o">%</span> <span class="bp">self</span><span class="o">.</span><span class="n">dest</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="37"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="k"><span class="hljs-keyword">print</span></span> <span class="s"><span class="hljs-string">' parser = </span></span><span class="si"><span class="hljs-string">%s</span></span><span class="s"><span class="hljs-string">'</span></span> <span class="o">%</span> <span class="nb">id</span><span class="p">(</span><span class="n">parser</span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="38"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="k"><span class="hljs-keyword">print</span></span> <span class="s"><span class="hljs-string">' values = </span></span><span class="si"><span class="hljs-string">%r</span></span><span class="s"><span class="hljs-string">'</span></span> <span class="o">%</span> <span class="n">values</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="39"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="k"><span class="hljs-keyword">print</span></span> <span class="s"><span class="hljs-string">' option_string = </span></span><span class="si"><span class="hljs-string">%r</span></span><span class="s"><span class="hljs-string">'</span></span> <span class="o">%</span> <span class="n">option_string</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="40"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="41"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="c"><span class="hljs-comment"># Do some arbitrary processing of the input values</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="42"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="k"><span class="hljs-keyword">if</span></span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">values</span><span class="p">,</span> <span class="nb">list</span><span class="p">):</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="43"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">values</span> <span class="o">=</span> <span class="p">[</span> <span class="n">v</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> <span class="k"><span class="hljs-keyword">for</span></span> <span class="n">v</span> <span class="ow"><span class="hljs-keyword">in</span></span> <span class="n">values</span> <span class="p">]</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="44"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="k"><span class="hljs-keyword">else</span></span><span class="p">:</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="45"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="n">values</span> <span class="o">=</span> <span class="n">values</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="46"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="c"><span class="hljs-comment"># Save the results in the namespace using the destination</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="47"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <span class="c"><span class="hljs-comment"># variable given to our constructor.</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="48"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> <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></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="49"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="50"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span> <span class="o">=</span> <span class="n">argparse</span><span class="o">.</span><span class="n">ArgumentParser</span><span class="p">()</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="51"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="52"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-a'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="n">CustomAction</span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="53"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'-m'</span></span><span class="p">,</span> <span class="n">nargs</span><span class="o">=</span><span class="s"><span class="hljs-string">'*'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="n">CustomAction</span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="54"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">parser</span><span class="o">.</span><span class="n">add_argument</span><span class="p">(</span><span class="s"><span class="hljs-string">'positional'</span></span><span class="p">,</span> <span class="n">action</span><span class="o">=</span><span class="n">CustomAction</span><span class="p">)</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="55"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"> </div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="56"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="n">results</span> <span class="o">=</span> <span class="n">parser</span><span class="o">.</span><span class="n">parse_args</span><span class="p">([</span><span class="s"><span class="hljs-string">'-a'</span></span><span class="p">,</span> <span class="s"><span class="hljs-string">'value'</span></span><span class="p">,</span> <span class="s"><span class="hljs-string">'-m'</span></span> <span class="s"><span class="hljs-string">'multi-value'</span></span><span class="p">,</span> <span class="s"><span class="hljs-string">'positional-value'</span></span><span class="p">])</span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="57"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">print</span></span></div></div></li><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="58"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line"><span class="k"><span class="hljs-keyword">print</span></span> <span class="n">results</span></div></div></li></ol></code><div class="hljs-button" data-title="复制"></div></pre></div><p><em>values</em>的类型取决于<em>nargs</em>的值。如果该参数允许多个值,则<em>values</em>会是一个列表,即使其仅包含一个列表项。</p><p><em>option_string</em>的值也取决于原有的参数规范。对于位置相关的、必需的参数,<em>option_string</em>始终为<strong>None</strong>。</p><pre οnclick="hljs.copyCode(event)"><code class="hljs vbnet"><ol class="hljs-ln"><li><div class="hljs-ln-numbers"><div class="hljs-ln-line hljs-ln-n" data-line-number="1"></div></div><div class="hljs-ln-code"><div class="hljs-ln-line">$ python argparse_custom_action.py
  6. Initializing CustomAction
  7. dest = 'a'
  8. option_strings = [ '-a']
  9. required = False
  10. Initializing CustomAction
  11. dest = 'm'
  12. nargs = '*'
  13. option_strings = [ '-m']
  14. required = False
  15. Initializing CustomAction
  16. dest = 'positional'
  17. option_strings = []
  18. required = True
  19. Processing CustomAction for "a"
  20. parser = 4299616464
  21. values = 'value'
  22. option_string = '-a'
  23. Processing CustomAction for "m"
  24. parser = 4299616464
  25. values = [ 'multi-value']
  26. option_string = '-m'
  27. Processing CustomAction for "positional"
  28. parser = 4299616464
  29. values = 'positional-value'
  30. option_string = None
  31. Namespace(a= 'VALUE', m=['MULTI-VALUE'], positional='POSITIONAL-VALUE')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值