<p>使用自定义的<code>type</code>,更容易控制错误消息(通过<code>ArgumentTypeError</code>)。我仍然需要<code>metavar</code>来控制用法显示。</p>
<pre><code>import argparse
def range_type(astr, min=0, max=101):
value = int(astr)
if min<= value <= max:
return value
else:
raise argparse.ArgumentTypeError('value not in range %s-%s'%(min,max))
parser = argparse.ArgumentParser()
norse = parser.add_argument_group('Norse')
...
norse.add_argument('--range', type=range_type,
help='Value in range: Default is %(default)s.',
default=49, metavar='[0-101]')
parser.print_help()
print parser.parse_args()
</code></pre>
<p>生产:</p>
<pre><code>2244:~/mypy$ python2.7 stack25295487.py --ran 102
usage: stack25295487.py [-h] [-n] [--threshold [0:101]] [--range [0-101]]
optional arguments:
-h, --help show this help message and exit
Norse:
...
--range [0-101] Value in range: Default is 49.
usage: stack25295487.py [-h] [-n] [--threshold [0:101]] [--range [0-101]]
stack25295487.py: error: argument --range: value not in range 0-101
</code></pre>
<p>我可以使用<code>functools.partial</code>自定义范围值:</p>
<pre><code>type=partial(range_type, min=10, max=90)
</code></pre>