- Часть I. Вводное руководство
- Глава 2. Использование интерпретатора
- 2.2. Интерпретатор и его среда
- 4.7.3. Именованные аргументы
4.7.3. Именованные аргументы
Функция может быть вызвана с использованием именованных аргументов (keyword arguments) в виде 'keyword = value'. Например, функция ask_ok() (раздел 4.7.1) может быть вызвана следующими способами:
ask_ok('Вы действительно хотите выйти?')
ask_ok(retries = 2, prompt = 'Перезаписать файл?')
ask_ok('Продолжим?', complaint = 'А теперь тоже самое, только по-русски!')
ask_ok('Удалить все файлы из корневого раздела?', 100, 'А может всё-таки удалить?')
Однако следующие вызовы ошибочны:
# Отсутствует обязательный аргумент
ask_ok()
# Неименованный аргумент следует за именованным
ask_ok(prompt = 'Перезаписать файл?', 2)
# Два значения для одного аргумента
ask_ok('Продолжим?', prompt = 'Да/Нет')
# Неизвестное имя аргумента
ask_ok(actor = 'Никулин')
В общем, в списке аргументов именованные аргументы должны следовать после позиционных. Не имеет значение, имеет неименованный аргумент значение по умолчанию или нет. Никакой аргумент не может быть передан более одного раза:
>>> def function(a):
... pass
...
>>> function(0, a=0)
...
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
function(0, a=0)
TypeError: function() got multiple values for keyword argument 'a'
Если в определении функции присутствует формальный параметр в виде **name, то его значением становится словарь, содержащий все именованные аргументы, чьи имена не соответствуют формальным параметрам. Такой способ можно комбинировать с формой *name, позволяющей получить кортеж (tuple), содержащий позиционные аргументы, не входящие в список формальных параметров. (Запись **name должна следовать после записи *name.) Например, определим функцию:
def example(formal, *arguments, **keywords):
print "Количество пользователей:", formal
print ’-’*40
for arg in arguments: print arg
print ’-’*40
for kw in keywords.keys():
print kw, ’:’, keywords[kw]
Ее можно вызвать следующим образом:
example(1000000,
’Это очень много’,
’Это действительно очень много’,
language = ’Python’,
author = ’Guido van Rossum’)
Вывод будет таким:
Количество пользователей: 1000000
----------------------------------------
Это очень много
Это действительно очень много
----------------------------------------
language: Python
author: Guido van Rossum