<p>只要看看<a href="http://www.python.org/dev/peps/pep-3102/" rel="nofollow noreferrer">PEP 3102</a>它似乎也与<a href="https://stackoverflow.com/questions/1098549/proper-way-to-use-kwargs-in-python">this</a>有某种联系。</p>
<p>总的来说,补丁和opt是用来接受变量参数的,但后者是用来接受关键字参数的。关键字参数作为字典传递,其中作为<a href="http://docs.python.org/tutorial/controlflow.html#arbitrary-argument-lists" rel="nofollow noreferrer">variable positional arguments would be wrapped as tuples </a>。</p>
<p>从你的例子</p>
<pre><code>def import_(ui, repo, patch1=None, *patches, **opts):
</code></pre>
<p><code>u1,repo and patch1</code>之后的任何位置参数都将以元组的形式封装在补丁中。变量位置参数后面的任何关键字参数都将通过opts包装为字典对象。</p>
<p>另一件重要的事情是,调用方有责任确保不违反条件<code>non-keyword arg after keyword arg</code>。</p>
<p>因此,违反此规则的内容将引发语法错误。。</p>
<p>例如</p>
<p>像这样的电话</p>
<pre><code> import_(1,2,3,test="test")
import_(1,2,3,4,test="test")
import_(1,2,3,4,5)
import_(1,2,patch1=3,test="test")
</code></pre>
<p>是有效的,但是</p>
<pre><code>import_(1,2,3,patch1=4,5)
</code></pre>
<p>会引发语法错误<code>SyntaxError: non-keyword arg after keyword arg</code></p>
<p>在第一个有效案例中<code>import_(1,2,3,test="test")</code></p>
<pre><code>u1 = 1, repo = 2, patch1 = 3, patches = () and opts={"test":"test"}
</code></pre>
<p>在第二种有效情况下<code>import_(1,2,3,patch1=4,test="test")</code></p>
<pre><code>u1 = 1, repo = 2, patch1 = 3 , patches = (4) and opts={"test":"test"}
</code></pre>
<p>在第三种有效情况下<code>import_(1,2,3,4,5)</code></p>
<pre><code>u1 = 1, repo = 2, patch1 = 3 , patches=(4,5), and opts={}
</code></pre>
<p>在第四种有效情况下<code>import_(1,2,patch1=3,test="test")</code></p>
<pre><code>u1 = 1, repo = 2, patch1 = 3 , patches=(), and opts={"test":"test"}
you can use patch1 as a keywords argument but doing so you cannot wrap any variable positional arguments within patches
</code></pre>