Открыть сервисСервис

Необязательные аргументы функций в Python

Необязательный аргумент — аргумент функции, значение которого может быть задано при вызове, а при отсутствии задания используется значение по умолчанию. В Python необязательные аргументы реализуются через синтаксис имя=значение в определении функции; в языках с типизацией (C++, Java, C#) аналогичную роль играют аргументы по умолчанию. Необязательные аргументы позволяют сократить число перегружаемых функций и сделать вызовы более гибкими.

Необязательные аргументы в Python

В Python необязательный аргумент объявляется присваиванием значения по умолчанию в сигнатуре функции:

``python def greet(name, greeting="Привет"): return f"{greeting}, {name}!" ``

При вызове greet("Анна") используется значение "Привет", при вызове greet("Анна", "Здравствуйте") — заданное значение. Обязательные аргументы (без значения по умолчанию) должны идти до необязательных, иначе интерпретатор выдаст синтаксическую ошибку SyntaxError: non-default argument follows default argument.

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

Необязательные аргументы можно передавать как позиционным способом, так и по имени:

``python greet("Анна", greeting="Добрый день") ``

Именованная передача повышает читаемость кода и позволяет менять порядок аргументов. Начиная с Python 3.8, перед именованным аргументом можно использовать оператор /, чтобы отделить строго позиционные аргументы:

``python def divide(a, b, /, precision=2): return round(a / b, precision) ``

Аргументы *args и **kwargs

Механизм необязательных аргументов дополняется переменным числом параметров. *args собирает позиционные аргументы в кортеж, **kwargs — именованные в словарь:

``python def log(message, *tags, level="INFO"): print(level, message, tags) ``

Такой приём часто используется при написании декораторов и обёрток над API.

Опасности значений по умолчанию

Значения по умолчанию вычисляются один раз — в момент определения функции, а не при каждом вызове. Из-за этого использование мутабельных объектов (списков, словарей) в качестве значений по умолчанию приводит к неожиданному поведению:

``python def add_item(item, bucket=[]): # ошибка bucket.append(item) return bucket ``

Каждый вызов add_item будет работать с одним и тем же списком. Идиоматичное решение — использовать None как заглушку:

``python def add_item(item, bucket=None): if bucket is None: bucket = [] bucket.append(item) return bucket ``

Необязательные аргументы в C++

В C++ аргументы по умолчанию задаются в объявлении функции после знака =:

``cpp void print(std::string text, int width = 80, bool wrap = true); ``

Вызов print("hello") использует значения по умолчанию для width и wrap. В отличие от Python, значения по умолчанию в C++ должны быть константными выражениями или ссылками на объекты с внешним linkage. Аргументы по умолчанию также поддерживаются в шаблонных функциях и методах классов. При перегрузке функций значения по умолчанию могут создавать неоднозначность, которую компилятор диагностирует как ошибку.

Необязательные аргументы в Java и C#

В Java до версии 26 необязательные аргументы не поддерживались на уровне языка; типичное решение — перегрузка методов или использование аннотации @Nullable. В C# необязательные параметры реализованы через ключевое слово optional и атрибут [Optional]:

``csharp void Resize(int width, int height = 100); ``

Вызов Resize(200) использует значение 100 для высоты. В C# значения по умолчанию, как и в C++, должны быть константами.

Применение

Необязательные аргументы широко используются в библиотеках научных вычислений: NumPy, Pandas, Matplotlib содержат функции с десятками необязательных параметров, что позволяет задавать только нужные настройки. В веб-разработке фреймворки Django и Flask используют необязательные аргументы для настройки маршрутизации и обработки запросов. Механизм также лежит в основе декораторов functools (functools.wraps принимает необязательные аргументы assigned и updated).

См. также

  • Значение по умолчанию
  • Перегрузка функций
  • Аргументы функции

Источники

  • Лутц М. «Изучаем Python» (Learning Python), 5-е издание
  • Beazley D. M. «Python Essential Reference», 4th edition
  • Страуструп Б. «Язык программирования C++» (The C++ Programming Language), 4th edition
  • Документация Python: Defining Functions (docs.python.org)
  • Документация Microsoft: Optional Parameters in C# (learn.microsoft.com)
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru