<p><code>set_defaults</code>可能是最简单的修复方法。在</p>
<p>但我认为值得一提的是,你可以直接改变一个动作的默认值</p>
<pre><code>filesParser = argparse.ArgumentParser(add_help=False)
outaction=filesParser.add_argument('-o', dest='outformat', default="smi")
parser = argparse.ArgumentParser(description='inherts from filesParser', parents=[filesParser])
fooaction=parser.add_argument(' foo')
print fooaction.default
# None
print outaction.default
# 'smi'
outaction.default='sdf'
args=parser.parse_args()
print args
# Namespace(foo=None, outformat='sdf')
</code></pre>
<p><code>add_argument</code>返回一个<code>Action</code>对象,其中包含您在参数中指定的所有信息。在这里,我将这些操作保存在变量<code>outaction</code>和<code>fooaction</code>中。<code>outaction.default</code>是<code>parse_args</code>使用的默认值。在</p>
<p>对于继承的代码,保存<code>outaction</code>链接可能会很尴尬(尽管可以在“parser.\u actions”列表中找到它)。所以让<code>set_defaults</code>为您做这项工作是有意义的。在</p>
<p><code>set_defaults</code>的代码可能具有指导意义:</p>
^{pr2}$
<p>首先,它将新的默认值放入<code>parser._defaults</code>字典中,然后有条件地修改<code>action.default</code>属性(注意搜索<code>parser._actions</code>)。它必须同时做到这两个,因为在使用默认值时,<code>action.default</code>值优先于<code>parser._defaults</code>值。在</p>
<p>如果在交互式shell(例如Ipython)中运行这段代码,并且可以打印<code>action</code>和{<cd17>}对象,那么这些细节将更有意义。关于使用“私有”属性的常见警告适用。在</p>