print("-"*40 ) for kw in keywords: print(kw,":", keywords[kw]) 

It could be called like this: 

cheeseshop("Limburger","It's very runny, sir. ", "It's really very, VERY runny, sir. ", shopkeeper="Michael Palin ", client="John Cleese", sketch="Cheese Shop Sketch ") 

and of course it would print: 

(continued from previous page) 

-- Do you have any Limburger ? -- I'm sorry, we're all out of Limburger It's very runny, sir. It's really very, VERY runny, sir. ---------------------------------------- shopkeeper : Michael Palin client : John Cleese sketch : Cheese Shop Sketch 

Note that the order in which the keyword arguments are printed is guaranteed to match the order in which they were provided in the function call. 

## 4.7.3 Special parameters 

By default, arguments may be passed to a Python function either by position or explicitly by keyword. For readability and performance, it makes sense to restrict the way arguments can be passed so that a developer need only look at the function definition to determine if items are passed by position, by position or keyword, or by keyword. 

A function definition may look like: 

def f(pos1, pos2, /, pos_or_kwd, *, kwd1, kwd2): ----------- ---------- | | | | Positional or keyword | | - Keyword only -- Positional only 

where$_{/}$and$_{*}$are optional. If used, these symbols indicate the kind of parameter by how the arguments may be passed to the function: positional-only, positional-or-keyword, and keyword-only. Keyword parameters are also referred to as named parameters. 

## Positional-or-Keyword Arguments 

If$_{/}$and$_{*}$are not present in the function definition, arguments may be passed to a function by position or by keyword. 

