<p>可能您有点混淆了函数定义和函数调用语法。</p>
<p><code>patch1</code>不是关键字arg,而是分配了默认参数值的位置arg。</p>
<p><code>*patches</code>是参数列表,而不是位置参数。</p>
<hr/>
<p>请从官方教程中查看此部分:</p>
<ul>
<li><a href="http://docs.python.org/tutorial/controlflow.html#more-on-defining-functions" rel="nofollow">http://docs.python.org/tutorial/controlflow.html#more-on-defining-functions</a></li>
</ul>
<p>现在让我以这个函数为例总结一下要点:</p>
<pre><code>def f1(a1, a2, a3=None, *args, **kwargs):
print a1, a2, a3, args, kwargs
</code></pre>
<p><strong>函数定义</strong></p>
<p>有许多参数是由名称(<code>a1</code>,<code>a2</code>和<code>a3</code>)显式定义的,其中<code>a3</code>将由<code>None</code>默认初始化,如果在调用期间未提供。参数<code>a1</code>和<code>a2</code>需要在该函数的任何有效调用中提供。</p>
<p>可以使用附加参数调用函数,这些参数将出现在字典<code>kwargs</code>(由关键字提供)或列表<code>args</code>(不由关键字提供)中。
如果函数定义中不存在<code>args</code>和<code>kwargs</code>,则除了函数定义中为函数调用显式命名的参数外,调用方将不允许添加更多参数。</p>
<p>在函数定义中,首先需要指定不带默认初始值设定项的显式参数,其次是带默认初始值设定项的显式参数,第三是参数列表,最后是关键字参数字典。</p>
<p><strong>函数调用</strong></p>
<p>有多种方法可以调用函数。例如,以下调用将产生相等的结果:</p>
<pre><code>f1(1, 2) # pass a1 and a2 as positional arguments
f1(a2=2, a1=1) # pass a1 and a2 as keyword arguments
f1(1, a2=2) # pass a1 as positional argument, a2 as keyword argument
</code></pre>
<p>也就是说,函数参数可以通过其位置(位置参数或非关键字参数)或其指定的名称(关键字参数)来解析。</p>
<p>调用函数时,需要将非关键字参数放在第一位,最后是关键字参数,例如</p>
<pre><code># demonstrate how some additional positional and keyword arguments are passed
f1(1, 2, 3, 4, 5, 6, 7, a4=8, a5=9, a6=10)
# prints:
# 1 2 3 (4, 5, 6, 7) {'a5': 9, 'a4': 8, 'a6': 10}
</code></pre>
<p>现在,不符合函数定义中指定参数列表的位置参数将附加到参数列表<code>*args</code>,不符合函数定义中指定参数列表的关键字参数将插入关键字参数字典<code>**kwargs</code>。</p>