Модуль 6 · Функции и модули

Справочник по Python · модуль 6 · функции и модули

Глава 6.5

6.5

Виды аргументов
и упаковка

Параметры описываются в определении функции, а аргументы передаются при вызове. Python умеет связывать их по позиции и имени, задавать значения по умолчанию и собирать произвольное количество значений через *args и **kwargs.

Категория
Интерфейс функций
Уровень
Средний
Связанные темы
def, вызов функций, кортежи, словари
Зачем это знать
Создавать понятные и гибкие функции

§1Параметр и аргумент

Схемаопределение и вызов
def greet(name):   # name — параметр
    print(name)

greet("Алиса")    # "Алиса" — аргумент

Параметр — имя во время описания функции. Аргумент — конкретное значение во время вызова. Разные способы передачи определяют, как Python свяжет их друг с другом.

§2Позиционные аргументы

Значения связываются с параметрами слева направо, поэтому порядок меняет смысл.

main.pyсвязь по позиции
def greet(name, age):
    print("Имя:", name)
    print("Возраст:", age)

greet("Алиса", 30)
Выводпервый и второй аргументы
Имя: Алиса
Возраст: 30

§3Именованные аргументы

Имя параметра можно указать в вызове. Тогда порядок именованных аргументов не влияет на связывание.

main.pyявные имена
def greet(name, age):
    print(name, age)

greet(age=30, name="Алиса")

После первого именованного аргумента нельзя добавлять обычный позиционный: greet(name="Алиса", 30) — синтаксическая ошибка.

§4Значения параметров по умолчанию

Если аргумент не передан, используется значение из сигнатуры. Обязательные параметры записываются раньше параметров со значением по умолчанию.

main.pyзначение можно заменить
def greet(name, greeting="Привет"):
    print(greeting, name)

greet("Алиса")
greet("Боб", "Здравствуйте")
Выводобычное и заменённое значения
Привет Алиса
Здравствуйте Боб
Изменяемое значение по умолчанию

Не используйте [] или {} как изменяемое значение по умолчанию: оно создаётся один раз и сохраняется между вызовами. Обычно берут None, а новую коллекцию создают внутри.

§5Произвольные позиционные аргументы: *args

Параметр со звёздочкой собирает оставшиеся позиционные аргументы в кортеж. Имя args принято по соглашению, но технически может быть другим.

main.pyвсе числа в одном кортеже
def show_total(*numbers):
    print(numbers)
    print(sum(numbers))

show_total(1, 2, 3, 4)
Выводtuple и сумма
(1, 2, 3, 4)
10

§6Произвольные именованные аргументы: **kwargs

Параметр с двумя звёздочками собирает оставшиеся именованные аргументы в словарь.

main.pyимена становятся ключами
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 вместе

main.pyдва вида упаковки
def inspect_call(*args, **kwargs):
    print(args)
    print(kwargs)

inspect_call(10, 20, mode="fast", debug=True)
Выводкортеж и словарь
(10, 20)
{'mode': 'fast', 'debug': True}

§8Параметры только для позиции: /

Параметры слева от / разрешено передавать только позиционно. Сам символ не является параметром.

main.pyимя параметра скрыто от вызова
def ratio(value, total, /):
    return value / total

print(ratio(25, 100))
Выводтолько позиции
0.25

§9Параметры только по имени: *

Параметры справа от отдельной * нужно указывать по имени. Это делает вызов с несколькими похожими настройками понятнее.

main.pyнастройки видны в вызове
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 — именованные в словарь. Символы / и * ограничивают допустимый способ вызова.

Глава 6.5 · Виды аргументов · Справочник по PythonАвтор: Макаров Максим Николаевич