Ключи.
В Питоне есть другая возможность передавать значения в функцию – через ключи в формате 'ключ=значение', например:
def parrot(voltage, state='крутой', action='шок', type='Волнистый'): print "-- "Попугай не будет", action, print "если вы пропустите ток в", voltage, "вольт через него." print "-- Попугай", type print "-- Это", state, "!"
Такую функцию можно вызвать любым из способов ниже:
parrot(1000) parrot(action = 'А-а-а-а-а-у-у-ш-ш-ш', voltage = 1000000) parrot('тысячу', state = 'заболеет') parrot('миллион', 'вернётся к жизни', 'прыжок')
А вот таким образом функцию вызывать нельзя:
parrot() # требуемый аргумент опущен parrot(voltage=5.0, 'dead') #аргумент не ключ использован как ключ parrot(110, voltage=220) # повторение значение одного и того же аргумента parrot(actor='John Cleese') # неизвестный ключ
В общем, список ключей может содержать ключи со значениями в любом порядке, причём неважно, имеет ли данный аргумент значение по умолчанию или нет. Но важно помнить, что нельзя дублировать аргумент, переданный в функцию, ключом. Например, вызов функции так, как показано ниже вызовет по этой причине ошибку:
>>> def function(a): ... pass ...
>>> function(0, a=0) ERROR: ключ переопределён
Если в заголовке функции присутствует параметр в формате **имя, то в него включаются все ключи, которые были переданы в функцию, но не были определены в её заголовке. С этим параметром может также употребляться другой параметр, имеющий формат *имя. В него передаются аргументы, не входящие в список обязательных параметров функции. Учтите, что аргумент *имя должен стоять перед **имя:
def cheeseshop(kind, *arguments, **keywords): print "-- У вас есть какие-нибудь", kind, '?' print "-- Нет, всех съели" for arg in arguments: print arg print '-'*40 for kw in keywords.keys(): print kw, ':', keywords[kw]
Функция может быть вызвана, например, так:
cheeseshop('Зонты', "Очень жаль.", "Действительно ужасно жаль, товарищ.", client='Михаил Горбачёв', shopkeeper='Борис Ельцин', sketch='Белый Дом')
и вот каким будет результат работы:
-- У вас есть какие-нибудь зонты?
-- Нет, всех съели
Очень жаль.
Действительно, ужасно жаль.
----------------------------------------
client : Михаил Горбачёв
shopkeeper : Борис Ельцин
sketch : Белый Дом