Why do we need them? Are they even ever used?
I bet you've seen them many times and ignored them. I'll go further and bet you've used them, too, without knowing
/2
>>> numbers = [4, 6, 7, 2]
>>> numbers.sort(reverse=True)
>>> numbers
[7, 6, 4, 2]
All fine here. But try to use a positional argument instead:
>>> numbers.sort(True)
Traceback (most recent call last):
...
TypeError: sort() takes no positional arguments
/4
How about `str.replace()`? You've used that too?
Here's the signature:
replace(self, old, new, count=-1, /)
`old`, `new`, and `count` are all positional-only
/6
Let's check:
>>> "hello".replace("l", '-')
'he--o'
>>> "hello".replace(old="l", new='-')
Traceback (most recent call last):
...
TypeError: str.replace() takes no keyword arguments
/7
Maybe you use NumPy a lot? Positional-only and keyword-only arguments appear very often in the NumPy codebase
Here's just one example, NumPy's `mean()` method:
a.mean(axis=None, dtype=None, out=None, keepdims=False, *, where=True)
/8
Or maybe you use Matplotlib? Here's `plt.scatter()`
Wait for it
scatter(x, y, s=None, c=None, marker=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=None, linewidths=None, *, edgecolors=None, plotnonfinite=False, data=None, **kwargs)
Did you spot the lone * ?
/9
They're easy to miss and ignore. But if you've read documentation, you will definitely have seen a * or a / in many function signatures
Now, when you see them next, you'll know perfectly well what they are and what they do
/10
Have you ever used `list.sort()` with the `key` or `reverse` parameters?
I bet you have!
Here's the signature for `list.sort()`
sort(self, /, *, key=None, reverse=False)
/3