What the article seems to miss, though (only skimmed it), is that you need to be incredibly careful with taking kwargs, specially if you're passing them along into secondary functions within the called function. Hidden bugs lie that way, as you could end up with bad/misspelled args that you think are having an effect, but aren't.
A much, much more simple way to put it is
anything *args is a list, anything **kwargs is
a dictionary.
The * simply means list (set).
** simply means dictionary (name/value pairs)
* and ** has a much different meaning in other
languages as parameters.
* args is very similar to ... in other languages
that let you send n arguments.