擅长:python、mysql、java
<p>因为如果关键字参数的位置是明确的,那么将关键字传递给该参数是可选的。注意:</p>
<pre><code>>>> def f(ui, patch1=None, *patches, **opts):
... print patch1
...
>>> f(1, 2)
2
>>> f(1, patch1='a', 3)
File "<stdin>", line 1
SyntaxError: non-keyword arg after keyword arg
>>> f(1, 'a', 3)
a
</code></pre>
<p>如您所见,省略<code>patch1</code>的键将该参数呈现为非关键字参数,因此不会触发<code>SyntaxError</code>异常。</p>
<hr/>
<p><strong>编辑:</strong>moooeeep在他的回答中说</p>
<blockquote>
<p>"patch1 is not a keyword arg, it's a positional arg with a default argument value assigned."</p>
</blockquote>
<p>这并没有错,但以下IMO的案例说明了为什么这种定义是含糊不清的:</p>
<pre><code>>>> def f(ui, p1=None, p2=None, *patches, **opts):
... print p1, p2
...
>>> f(1, 'a', 'b', 3) #p2 is a positional argument with default value?
a b
>>> f(1, p2='b') #p2 is a keyword argument?
None b
</code></pre>
<p>啊!</p>