title: What is the purpose of a bare asterisk in function arguments?
body: <p>I've seen this SO question (this is not a duplicate): <a href="https://stackoverflow.com/questions/14301967/python-bare-asterisk-in-function-argument">Python bare asterisk in function argument</a></p>
  
  <p>In python-3.x you can add a bare <code>*</code> to the function arguments, this means that (quote from <a href="https://docs.python.org/3/reference/compound_stmts.html#function-definitions" rel="noreferrer">docs</a>):</p>
  
  <blockquote>
    <p>Parameters after “*” or “*identifier” are keyword-only parameters and
    may only be passed used keyword arguments.</p>
  </blockquote>
  
  <p>Ok, so, I've defined a function:</p>
  
  <pre><code>&gt;&gt;&gt; def f(a, b, *, c=1, d=2, e=3):
  ...     print('Hello, world!')
  ... 
  </code></pre>
  
  <p>I can pass <code>c</code>, <code>d</code> and <code>e</code> variable values only by specifying keywords:</p>
  
  <pre><code>&gt;&gt;&gt; f(1, 2, 10, 20, 30)
  Traceback (most recent call last):
    File "&lt;stdin&gt;", line 1, in &lt;module&gt;
  TypeError: f() takes 2 positional arguments but 5 were given
  &gt;&gt;&gt; f(1, 2, c=10, d=20, e=30)
  Hello, world!
  </code></pre>
  
  <p>Questions are:</p>
  
  <ul>
  <li>What is the motivation for this kind of restriction/syntax sugar? </li>
  <li>What use cases does it cover?</li>
  <li>Is it really used in third-party libraries that switched to python3?</li>
  </ul>
  
  <p>Some "real-world" examples would help a lot. Thanks in advance.</p>