<p>只需对解析器进行一些调整。请注意<code>add_argument</code>返回一个<code>Action</code>对象,可以忽略该对象,也可以将其赋值给变量:</p>
<pre><code>In [19]: import argparse
In [20]: parser = argparse.ArgumentParser()
...: a1 = parser.add_argument("-i", " input_file", action="store", type=str, help="input video file")
...: a2 = parser.add_argument("-o", " output_file", action="store", type=str, help="output video file")
...: a3 = parser.add_argument("-s", " stamp", action="store_true", help="enable frame stamping")
...: a4 = parser.add_argument("foobar")
</code></pre>
<p>动作的<code>repr</code>是什么样子的。这些是主要属性,但不是全部</p>
<pre><code>In [21]: a1
Out[21]: _StoreAction(option_strings=['-i', ' input_file'], dest='input_file', nargs=None, const=None, default=None, type=<class 'str'>, choices=None, help='input video file', metavar=None)
In [22]: a3
Out[22]: _StoreTrueAction(option_strings=['-s', ' stamp'], dest='stamp', nargs=0, const=True, default=False, type=None, choices=None, help='enable frame stamping', metavar=None)
In [23]: a4
Out[23]: _StoreAction(option_strings=[], dest='foobar', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
</code></pre>
<p>解析器本身是一个对象,具有方法和属性</p>
<pre><code>In [24]: parser._actions
Out[24]:
[_HelpAction(option_strings=['-h', ' help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None),
_StoreAction(option_strings=['-i', ' input_file'], dest='input_file', nargs=None, const=None, default=None, type=<class 'str'>, choices=None, help='input video file', metavar=None),
_StoreAction(option_strings=['-o', ' output_file'], dest='output_file', nargs=None, const=None, default=None, type=<class 'str'>, choices=None, help='output video file', metavar=None),
_StoreTrueAction(option_strings=['-s', ' stamp'], dest='stamp', nargs=0, const=True, default=False, type=None, choices=None, help='enable frame stamping', metavar=None),
_StoreAction(option_strings=[], dest='foobar', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)]
</code></pre>
<p>我们可以使用适当的字符串列表测试解析器,模拟通过命令行提交的值</p>
<pre><code>In [25]: args = parser.parse_args([])
usage: ipython3 [-h] [-i INPUT_FILE] [-o OUTPUT_FILE] [-s] foobar
ipython3: error: the following arguments are required: foobar
An exception has occurred, use %tb to see the full traceback.
SystemExit: 2
</code></pre>
<p>如果有足够的必需参数,结果<code>Namespace</code>将显示所有已定义的参数(除非某些参数是<code>SUPRESSED</code>):</p>
<pre><code>In [26]: args = parser.parse_args(['xxx'])
In [27]: args
Out[27]: Namespace(foobar='xxx', input_file=None, output_file=None, stamp=False)
</code></pre>
<p>我们可以把这个名称空间对象看作一个字典,例如</p>
<pre><code>In [28]: vars(args)
Out[28]: {'input_file': None, 'output_file': None, 'stamp': False, 'foobar': 'xxx'}
In [29]: list(vars(args).keys())
Out[29]: ['input_file', 'output_file', 'stamp', 'foobar']
</code></pre>
<p>这些键对应于参数<code>dest</code>属性</p>