可以通过形式<kwarg = value>关键字参数调用方法。例如, 接下来方法:
def parrot(voltage, state=’a stiff’, action=’voom’, type=’Norwegian Blue’):
print("-- This parrot wouldn’t", action, end=’ ’)
print("if you put", voltage, "volts through it.")
print("-- Lovely plumage, the", type)
print("-- It’s", state, "!")
接受1个要求的参数(voltage)和三个可选择参数(state, action和type)。这个方法用以下任何一种方法调用。
parrot(1000) # 1 positional argument
parrot(voltage=1000) # 1 keyword argument
parrot(voltage=1000000, action=’VOOOOOM’) # 2 keyword arguments
parrot(action=’VOOOOOM’, voltage=1000000) # 2 keyword arguments
parrot(’a million’, ’bereft of life’, ’jump’) # 3 positional arguments
parrot(’a thousand’, state=’pushing up the daisies’) # 1 positional, 1 keyword
但以下方法调用时不合法:
parrot() # required argument missing 必须的参数缺失
parrot(voltage=5.0, ’dead’) # non-keyword argument after a keyword argument 关键参数后无关键参数
parrot(110, voltage=220) # duplicate value for the same argument 同一参数重复赋值
parrot(actor=’John Cleese’) # unknown keyword argument 无名的关键参数
在方法调用中,关键字参数必须遵循位置参数。 所有的关键参数必须符合方法接受的参数其中之一。(例如, actor不是parrot方法的合法参数),但是它们的次序不重要。这包含非选择的参数(例如parrot(voltage = 1000)是合法的)。没有参数可以多次接受一个值。以下例子由于这种限制而运行有问题。
>>> def function(a):
... pass
...
>>> function(0, a=0)
Traceback (most recent call last):
File "<stdin>", line 1, in ?
TypeError: function() got multiple values for keyword argument ’a’
当最后一个形参是**name时,它可以接受包含除了形式参数之外的所有关键字的字典。这可以和形如“*name”的形式参数结合使用。*name将会在下节讲到,它可以接受包含位置参数的数组。*name必须在**name之前出现。例如,我们可以如下方法:
def cheeseshop(kind,*arguments,**keywords):
print("-- Do you have any", kind, "?")
print("-- I’m sorry, we’re all out of", kind)
for arg in arguments:
print(arg)
print("-"*40)
keys = sorted(keywords.keys())
for kw in keys:
print(kw, ":", keywords[kw])
它可以按照如下方法调用
cheeseshop("Limburger", "It’s very runny, sir.",
"It’s really very, VERY runny, sir.",
shopkeeper="Michael Palin",
client="John Cleese",
sketch="Cheese Shop Sketch")
结果如下:
-- 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.
----------------------------------------client : John Cleese
shopkeeper : Michael Palin
sketch : Cheese Shop Sketch
注意:关键字参数名字的列表通过在打印关键字典内容之前调用keys()方法进行创建。如果没有根据这创建,参数打印的序列将没有定义。