<p>在Python2.7.3中,<code>parse_known_args</code>(由<code>parse_args</code>调用)的早期,<code>namespace</code>中插入了默认值。在</p>
<pre><code> # add any action defaults that aren't present
for action in self._actions:
if action.dest is not SUPPRESS:
if not hasattr(namespace, action.dest):
if action.default is not SUPPRESS:
default = action.default
if isinstance(action.default, basestring): # delayed in 3.3.1
default = self._get_value(action, default)
setattr(namespace, action.dest, default)
</code></pre>
<p>如果<code>default</code>是一个字符串,它将通过<code>_get_value</code>传递,该函数调用适当的<code>type</code>,在您的例子中是{<cd7>}。这就产生了你所看到的错误。在</p>
<p>在3.3.1的新闻中<a href="https://docs.python.org/3.3/whatsnew/changelog.html" rel="nofollow">https://docs.python.org/3.3/whatsnew/changelog.html</a></p>
<blockquote>
<p>Issue #12776, issue #11839: Call argparse type function (specified by add_argument) only once. Before, the type function was called twice in the case where the default was specified and the argument was given as well. This was especially problematic for the FileType type, as a default file would always be opened, even if a file argument was specified on the command line.</p>
</blockquote>
<p>通过此更改,<code>_get_value</code>调用被推迟到<code>parse_known_args</code>的末尾,并且只有在解析没有在那里放置其他值时才会调用它(需要默认值)。在</p>
^{pr2}$
<p>所以您的脚本在我的开发副本上按预期运行(使用'-h')。我不完全确定Python的哪个版本有这种更正。在</p>
<p>因此,在运行更新的Python版本之前,您有责任确保<code>default</code>是一个有效值。即使有了这个bug修复,在给<code>add_argument()</code>调用之前,最好确保默认值是有效的。无论何时处理,无效的默认值都会使用户感到困惑。在</p>