<p>我解决这个问题的第一种方法是使用<code>action='append'</code>,并在解析后将结果列表转换为字典。代码量也差不多。在</p>
<p>“append”在默认值上也有同样的问题。如果<code>default=['defaultstring']</code>,则列表也将以该值开头。我将通过使用默认默认值([]见下文)来解决这个问题,并在后期处理中添加默认值(如果列表仍然为空或无)。在</p>
<p>关于违约的说明。在<code>parse_args</code>的开头,所有操作默认值都被添加到名称空间中(除非名称空间作为<code>parse_args</code>的参数给定)。然后解析命令行,每个操作对命名空间执行自己的操作。最后,使用<code>type</code>函数转换任何剩余的字符串默认值。在</p>
<p>在您的例子中,<code>namespace.user_nets[location] = subnet</code>找到<code>user_nets</code>属性,并添加新条目。默认情况下,该属性被初始化为字典,因此默认值出现在最终字典中。事实上,如果将默认值保留为<code>None</code>或某个字符串,则代码将无法工作。在</p>
<p><code>_AppendAction</code>类的<code>call</code>可能具有指导意义:</p>
<pre><code>def __call__(self, parser, namespace, values, option_string=None):
items = _copy.copy(_ensure_value(namespace, self.dest, []))
items.append(values)
setattr(namespace, self.dest, items)
</code></pre>
<p><code>_ensure_value</code>是在<code>argparse</code>中定义的函数。<code>_copy</code>是它导入的标准<code>copy</code>模块。在</p>
<p><code>_ensure_value</code>的作用类似于字典<code>get(key, value, default)</code>,但与<code>namespace</code>对象一起使用除外。在本例中,如果<code>self.dest</code>没有值(或者值是<code>None</code>),则返回一个空列表。因此,它确保append以一个列表开始。在</p>
<p><code>_copy.copy</code>确保它向副本追加值。这样,<code>parse_args</code>将不会修改<code>default</code>。它避免了<code>@miles82</code>所指出的问题。在</p>
<p>所以'append action'在<code>call</code>本身中定义了初始空列表。并使用<code>copy</code>来避免修改任何其他默认值。在</p>
<p>你想要<code>values</code>而不是{<cd27>}?在</p>
^{pr2}$
<p>我倾向于把这个转换放在一个类型函数中,例如</p>
<pre><code>def dict_type(astring):
key, value = astring.split(':')
return {key:value}
</code></pre>
<p>这也是进行错误检查的好地方。在</p>
<p>在操作或解析后,可以使用<code>update</code>将它们添加到现有的词典中。在</p>