回答此问题可获得 20 贡献值,回答如果被采纳可获得 50 分。
<p>在python中,我可以定义如下函数:</p>
<pre><code>def func(kw1=None,kw2=None,**kwargs):
...
</code></pre>
<p>在这种情况下,我可以将func称为:</p>
<pre><code>func(kw1=3,kw2=4,who_knows_if_this_will_be_used=7,more_kwargs=Ellipsis)
</code></pre>
<p>我还可以将函数定义为:</p>
<pre><code>def func(arg1,arg2,*args):
...
</code></pre>
<p>可以称为</p>
<pre><code>func(3,4,additional,arguments,go,here,Ellipsis)
</code></pre>
<p>最后,我可以把这两种形式结合起来</p>
<pre><code>def func(arg1,arg2,*args,**kwargs):
...
</code></pre>
<p>但是,不起作用的是:</p>
<pre><code>func(arg1,arg2,*args,kw1=None,kw2=None,**kwargs): #SYNTAX ERROR (in python 2 only, apparently this works in python 3)
...
</code></pre>
<p>我最初的想法是这可能是因为</p>
<pre><code>def func(arg1,arg2,*args,kw1=None):
...
</code></pre>
<p>可以称为</p>
<pre><code>func(1,2,3) #kw1 will be assigned 3
</code></pre>
<p>因此,这将引入一些关于3是否应该打包成args或kwargs的模糊性。但是,对于python 3,可以指定仅关键字的参数:</p>
<pre><code>def func(a,b,*,kw=None): #can be called as func(1,2), func(1,2,kw=3), but NOT func(1,2,3)
...
</code></pre>
<p>因此,似乎不存在以下语法歧义:</p>
<pre><code>def func(a,b,*args,*,kw1=None,**kwargs):
...
</code></pre>
<p>但是,这仍然会导致语法错误(使用Python3.2测试)。我失踪的原因是什么?还有,有没有办法得到我上面描述的行为(有带默认参数的*args)——我知道我可以通过在函数中操作kwargs字典来模拟这种行为。</p>