Справочник по Python · модуль 6 · функции и модули
Глава 6.5
Виды аргументов
и упаковка
Параметры описываются в определении функции, а аргументы передаются при вызове. Python умеет связывать их по позиции и имени, задавать значения по умолчанию и собирать произвольное количество значений через *args и **kwargs.
- Категория
- Интерфейс функций
- Уровень
- Средний
- Связанные темы
- def, вызов функций, кортежи, словари
- Зачем это знать
- Создавать понятные и гибкие функции
§1Параметр и аргумент
def greet(name): # name — параметр print(name) greet("Алиса") # "Алиса" — аргумент
Параметр — имя во время описания функции. Аргумент — конкретное значение во время вызова. Разные способы передачи определяют, как Python свяжет их друг с другом.
§2Позиционные аргументы
Значения связываются с параметрами слева направо, поэтому порядок меняет смысл.
def greet(name, age): print("Имя:", name) print("Возраст:", age) greet("Алиса", 30)
Имя: Алиса Возраст: 30
§3Именованные аргументы
Имя параметра можно указать в вызове. Тогда порядок именованных аргументов не влияет на связывание.
def greet(name, age): print(name, age) greet(age=30, name="Алиса")
После первого именованного аргумента нельзя добавлять обычный позиционный: greet(name="Алиса", 30) — синтаксическая ошибка.
§4Значения параметров по умолчанию
Если аргумент не передан, используется значение из сигнатуры. Обязательные параметры записываются раньше параметров со значением по умолчанию.
def greet(name, greeting="Привет"): print(greeting, name) greet("Алиса") greet("Боб", "Здравствуйте")
Привет Алиса Здравствуйте Боб
Не используйте [] или {} как изменяемое значение по умолчанию: оно создаётся один раз и сохраняется между вызовами. Обычно берут None, а новую коллекцию создают внутри.
§5Произвольные позиционные аргументы: *args
Параметр со звёздочкой собирает оставшиеся позиционные аргументы в кортеж. Имя args принято по соглашению, но технически может быть другим.
def show_total(*numbers): print(numbers) print(sum(numbers)) show_total(1, 2, 3, 4)
(1, 2, 3, 4) 10
§6Произвольные именованные аргументы: **kwargs
Параметр с двумя звёздочками собирает оставшиеся именованные аргументы в словарь.
def show_profile(**info): for key, value in info.items(): print(key, value) show_profile(name="Алиса", age=30, city="Москва")
name Алиса age 30 city Москва
§7*args и **kwargs вместе
def inspect_call(*args, **kwargs): print(args) print(kwargs) inspect_call(10, 20, mode="fast", debug=True)
(10, 20)
{'mode': 'fast', 'debug': True}§8Параметры только для позиции: /
Параметры слева от / разрешено передавать только позиционно. Сам символ не является параметром.
def ratio(value, total, /): return value / total print(ratio(25, 100))
0.25
§9Параметры только по имени: *
Параметры справа от отдельной * нужно указывать по имени. Это делает вызов с несколькими похожими настройками понятнее.
def connect(host, *, timeout=30, secure=True): print(host, timeout, secure) connect("example.com", timeout=10, secure=False)
§10Полный порядок параметров
def function(positional_only, /, positional_or_keyword, *args, keyword_only, **kwargs):
| Запись | Как передаётся | Что получает функция |
|---|---|---|
до / | только по позиции | обычные значения |
между / и * | по позиции или имени | обычные значения |
*args | лишние позиционные | кортеж |
после * | только по имени | обычные значения |
**kwargs | лишние именованные | словарь |
§11Частые ошибки
| Что написано | Что произойдёт | Как правильно |
|---|---|---|
def f(optional=0, required): | SyntaxError: обязательный параметр записан после параметра по умолчанию | def f(required, optional=0): |
greet(name="Алиса", 30) | SyntaxError: позиционный аргумент идёт после именованного | greet("Алиса", 30) или указать оба имени |
| один параметр получает значение по позиции и по имени | TypeError: передано несколько значений | передать параметр только одним способом |
*args считают списком | методы списка могут отсутствовать | помнить, что внутри это кортеж |
**kwargs считают набором любых аргументов | позиционные значения туда не попадут | для них отдельно использовать *args |
§12Проверьте себя
Чем параметр отличается от аргумента?
Параметр записан в определении функции, аргумент — конкретное значение в её вызове.
Во что упаковываются *args и **kwargs?
*args — в кортеж, **kwargs — в словарь.
Что означает отдельная звёздочка в сигнатуре?
Следующие за ней параметры можно передавать только по имени.
§13Шпаргалка
function(value)function(name=value)def function(*args):def function(**kwargs):Итог главы
Аргументы связываются с параметрами по позиции или имени. Значение по умолчанию делает аргумент необязательным, *args собирает лишние позиционные значения в кортеж, а **kwargs — именованные в словарь. Символы / и * ограничивают допустимый способ вызова.