<p>在<code>argparse</code>中,不带前缀的参数(默认前缀为<code>-</code>表示缩写,默认前缀为<code> </code>表示完整参数名)被视为强制参数。所以,如果你想有一个可选的参数,你可以这样做:</p>
<pre class="lang-py prettyprint-override"><code>parser = argparse.ArgumentParser()
parser.add_argument(' myargs', nargs=2, default=['foo', 'bar'])
</code></pre>
<p>在本例中,如果未传递任何参数,则其工作方式与预期相同:</p>
<pre class="lang-py prettyprint-override"><code>print(parser.parse_args([]))
Namespace(myargs=['foo', 'bar'])
</code></pre>
<p>另一方面,如果提供相同的值:</p>
<pre class="lang-py prettyprint-override"><code>print(parser.parse_args([' myargs', 'a', 'b']))
Namespace(myargs=['a', 'b'])
</code></pre>
<p>如果在<code>myargs</code>之后传递了错误数量的参数,则会引发错误:</p>
<pre class="lang-py prettyprint-override"><code>print(parser.parse_args([' myargs', 'a']))
usage: scratch_2.py [-h] [ myargs MYARGS MYARGS]
<your script name>: error: argument myargs: expected 2 arguments
</code></pre>
<p>另一种(更长的)方法是定义自定义操作来解析参数:</p>
<pre class="lang-py prettyprint-override"><code>class CustomParsePositional(argparse.Action):
"""Action to parse arguments with a custom processing"""
def __init__(self, option_strings, dest, nargs=None, **kwargs):
super().__init__(option_strings, dest, nargs='*', **kwargs)
self._custom_nargs = len(kwargs.get('default', []))
def __call__(self, parser, namespace, values, option_string=None):
if len(values) != self._custom_nargs:
parser.error('Incorrect number of arguments')
namespace.__setattr__(self.dest, values)
parser = argparse.ArgumentParser()
parser.add_argument('myargs', default=['foo', 'bar'], type=str, action=CustomParsePositional)
</code></pre>
<p>在这种情况下,期望值的数量由<code>add_argument</code>的<code>default</code>参数中的项数推断出来。这里有一些例子:</p>
<pre class="lang-py prettyprint-override"><code>print(parser.parse_args(['a', 'b']))
print(parser.parse_args([]))
print(parser.parse_args(['a']))
Namespace(myargs=['a', 'b'])
Namespace(myargs=['foo', 'bar'])
usage: scratch_2.py [-h] [myargs [myargs ...]]
<your script name>: error: Incorrect number of arguments
</code></pre>
<p>如果你传递了3个值,你也会得到一个错误:</p>
<pre class="lang-py prettyprint-override"><code>print(parser.parse_args(['a', 'b', 'c']))
usage: scratch_2.py [-h] [myargs [myargs ...]]
<your script name>: error: Incorrect number of arguments
</code></pre>