<p>很明显,<code>argparse</code>在内部将默认值作为结果对象的初始值,因此不应在<code>add_argument</code>调用中直接设置默认值,而是进行一些额外的处理:</p>
<pre><code>parser.add_argument(' add-net',
action=ParseIPNets,
dest='user_nets',
help='Nets subnets for users. Can be used multiple times',
default = {})
args = parser.parse_args()
if len(args.user_nets) == 0:
args.user_nets['user1'] = "198.51.100.0/24"
</code></pre>
<p>或者,如果希望获得更好的用户体验,可以使用Python处理可变默认参数的方式:</p>
^{pr2}$
<p>这样,如果选项存在,可选的默认值将被清除。在</p>
<p>但是<strong>注意</strong>:这只在第一次调用脚本时有效。这里可以接受,因为<code>parser.parse_args()</code>在脚本中只应调用一次。在</p>
<p>附带说明:我删除了<code>nargs='*'</code>,因为如果你这样称呼它,我发现它比有用的更危险,而且还删除了<code>values</code>上始终使用<code>values</code>的错误循环:</p>
<pre><code>test.py add-net=a:10.0.0.0/24 add-net=b:10.1.0.0/24
</code></pre>
<p><code>nargs='*'</code>对以下语法有意义:</p>
<pre><code>test.py add-net a:10.0.0.0/24 b:10.1.0.0/24
</code></pre>
<p>代码应该是:</p>
<pre><code> def __call__(self, parser, namespace, values, option_string=None, first=[True]):
if first[0]:
namespace.user_nets.clear()
first[0] = False
for value in values:
location, subnet = value.split(':')
namespace.user_nets[location] = subnet
</code></pre>