<p>不要命名变量(包括参数)<code>str</code>,因为它将隐藏内置的<code>str</code>函数/类型!您可以使用<code>str</code>作为类型注释,但它应该位于参数名称之后,例如<code>foo: str</code></p>
<p><code>**kwargs</code>的思想是让函数能够接受任意一组关键字参数(而不是位置参数)。在函数的实现中,参数以<code>dict</code>的形式提供</p>
<pre><code>def alliteration_check(**kwargs: str) -> bool:
for s in kwargs.values():
w1, w2 = s.split()
if w1[0].upper() != w2[0].upper():
return False
return True
</code></pre>
<p>您需要使用关键字参数调用此函数,如下所示:</p>
<pre><code>alliteration_check(thing1="zig zag", other_thing="awkward alligator")
</code></pre>
<p>如果希望用户能够使用任意数量的<em>位置</em>参数而不是<em>关键字</em>参数调用函数,请使用<code>*args</code>:</p>
<pre><code>def alliteration_check(*args: str) -> bool:
for s in args:
w1, w2 = s.split()
if w1[0].upper() != w2[0].upper():
return False
return True
</code></pre>
<pre><code>alliteration_check("zig zag", "awkward alligator")
</code></pre>
<p>您还可以将这两种方法结合使用(即,使用一个同时使用<code>*args</code>和<code>**kwargs</code>的函数),以便能够以以下任一语法处理参数:</p>
<pre><code>def alliteration_check(*args: str, **kwargs: str) -> bool:
for s in (*args, *kwargs.values()):
w1, w2 = s.split()
if w1[0].upper() != w2[0].upper():
return False
return True
</code></pre>