Keyword arguments are good when you have a long list of parameters without a clearly defined order (that you cannot easily find a clear outline for remembering); however, there are many situations where their use is excessively large or makes the program less clear.
First, it is sometimes much easier to remember the order of keywords than the names of the keyword arguments, and specifying the names of the arguments can make it less clear. Take randint from scipy.random with the following docstring:
randint(low, high=None, size=None) Return random integers x such that low <= x < high. If high is None, then 0 <= x < low.
When you want to generate a random int from [0.10), it is clearer to write randint(10) than randint(low=10) in my opinion. If you need to create an array with 100 numbers in [0.10), you can probably remember the order of the arguments and write randint(0, 10, 100) . However, you may not remember the names of the variables (for example, this is the first parameter: low, lower, initial, minimum, minimum), and as soon as you have to look for the names of the parameters, you can also not use them (since you were just looking for the proper order).
We also consider variational functions (those that have a variable number of parameters that are anonymous themselves). For example, you can write something like:
def square_sum(*params): sq_sum = 0 for p in params: sq_sum += p*p return sq_sum
which can be applied to empty parameters ( square_sum(1,2,3,4,5) # gives 55 ). Of course, you could write a function to take the named keyword iterable def square_sum(params): and call it square_sum([1,2,3,4,5]) , but this may be less intuitive, especially when not no confusion about the name of the argument or its contents.