<p>在Ipython会话中简化解析器:</p>
<pre><code>In [1004]: parser=argparse.ArgumentParser()
In [1005]: parser.add_argument(' dos', nargs='?')
In [1007]: parser.parse_args(' dos 111'.split())
Out[1007]: Namespace(dos='111')
</code></pre>
<p>在本例中,<code>args.dos</code>将是字符串“111”,其中<code>len</code>3,而{<cd3>}是数字1。将<code>nargs</code>留空(默认无)。在</p>
<p>使用<code>nargs='?'</code>我还可以使用不带参数的标志,在这种情况下,值是默认值<code>None</code>。在</p>
^{pr2}$
<p><code>nargs=</code>?<code>is most useful with a</code>const<code>, which gives a convenient 3 way action. I can add</code>type=int`将字符串(如果有的话)转换为整数。在</p>
<pre><code>In [1015]: parser.add_argument(' dos', nargs='?', type=int,
default=None, const=123)
In [1016]: parser.parse_args([]) # not used
Out[1016]: Namespace(dos=None)
In [1017]: parser.parse_args(' dos'.split()) # without argument
Out[1017]: Namespace(dos=123)
In [1018]: parser.parse_args(' dos 456'.split()) # with argument
Out[1018]: Namespace(dos=456)
</code></pre>
<p>其他的<code>nargs</code>,比如1,'*'和'+'给你一个列表,你可以检查它的长度等等</p>
<p>=================</p>
<p>在你的<code>argv</code>测试中</p>
<pre><code>if len(sys.argv) > 2:
chosen = int(sys.argv[2])
chdos = "at_dos"+sys.argv[2]+".dat"
</code></pre>
<p><code>sys.argv</code>是一个列表,因此如果有足够的元素来应用<code>sys.argv[2]</code>步骤,那么len是计数的。在</p>
<p>这不起作用,因为<code>args.dos</code>是单个字符串,而不是列表。在</p>
<pre><code>if len(args.dos) > 1:
chosen = int(args.dos[0])
chdos = "at_dos"+args.dos[0]+".dat"
</code></pre>
<p><code>len(args.dos)</code>是字符串中的字符数,<code>args.dos[0]</code>是第一个字符。在</p>
<p>==========</p>
<p>如果我定义:</p>
<pre><code>def get_dos(argv=None):
parser=argparse.ArgumentParser()
parser.add_argument(' dos', type=int, nargs='?')
args = parser.parse_args(argv)
chosen = args.dos
if chosen is not None:
chdos = 'at_dos%s.dat'%chosen
else:
chdos = ''
return chosen, chdos
</code></pre>
<p>这些测试产生的值符合您的需要:</p>
<pre><code>In [1042]: get_dos([])
Out[1042]: (None, '')
In [1043]: get_dos([' dos'])
Out[1043]: (None, '')
In [1044]: get_dos([' dos','123'])
Out[1044]: (123, 'at_dos123.dat')
</code></pre>