← Назад к вопросам

Что такое *args?

2.0 Middle🔥 201 комментариев
#Soft skills и карьера#Автоматизация тестирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое *args в Python?

*args — это специальный синтаксис в Python, который позволяет функции принимать произвольное количество позиционных аргументов. Это мощный инструмент для создания гибких и универсальных функций, где число входных параметров заранее неизвестно или может варьироваться.

Основные принципы работы

Ключевые аспекты *args:

  • * (звёздочка) — оператор распаковки (unpacking) или упаковки (packing) итерабельных объектов.
  • args — это просто соглашение об именовании (можно использовать любое имя, например *arguments или *items), но args является стандартом де-факто.
  • Все переданные позиционные аргументы, для которых не выделен отдельный параметр, автоматически упаковываются в кортеж (tuple) с именем args.

Пример и базовое использование

def sum_all(*args):
    """Суммирует произвольное количество чисел."""
    print(f"Тип args: {type(args)}")  # <class 'tuple'>
    print(f"Полученные аргументы: {args}")
    return sum(args)

# Вызов функции с разным количеством аргументов
print(sum_all(1, 2))           # Вывод: 6
print(sum_all(1, 2, 3, 4, 5))  # Вывод: 15
print(sum_all())               # Вывод: 0 (кортеж пуст)

Зачем это нужно QA Engineer?

Понимание *args важно не только для написания автотестов, но и для чтения и анализа кода приложений:

  1. Тестирование функций с переменным числом параметров: Вы можете спроектировать тестовые данные, чтобы проверить поведение функции при передаче 0, 1, 10 или 1000 аргументов, включая граничные случаи.
  2. Создание универсальных утилит/хелперов: Например, функция для логирования, которая может принимать разное количество объектов для вывода.
    def test_log(*messages, level="INFO"):
        """Вспомогательная функция логирования в тестах."""
        full_message = " ".join(str(m) for m in messages)
        print(f"[{level}] {full_message}")
    
    test_log("Начало теста", "UserService")  # [INFO] Начало теста UserService
    test_log("Ошибка:", "Timeout", 504, level="ERROR") # [ERROR] Ошибка: Timeout 504
    
  3. Передача аргументов в другие функции: Часто используется в декораторах или фасадах для проброса параметров.
    def retry_on_failure(max_retries=3):
        """Декоратор для повторного выполнения теста при сбое."""
        def decorator(func):
            def wrapper(*args, **kwargs):
                for attempt in range(max_retries):
                    try:
                        return func(*args, **kwargs)  # Распаковка args и kwargs
                    except AssertionError as e:
                        print(f"Попытка {attempt+1} не удалась: {e}")
                raise Exception(f"Тест не прошёл после {max_retries} попыток")
            return wrapper
        return decorator
    
    @retry_on_failure(2)
    def test_flaky_api(user_id, endpoint):
        # ... имитация нестабильного теста ...
        pass
    
    test_flaky_api(123, "/api/profile")  # Декоратор корректно передаст оба аргумента в тест.
    

Важные отличия и связь с kwargs

  • *args собирает позиционные аргументы в кортеж.
  • **kwargs (с двумя звёздочками) собирает именованные аргументы (keyword arguments) в словарь (dict).
  • Их можно и нужно комбинировать в определении функции, соблюдая строгий порядок:
    1.  Обычные позиционные аргументы.
    2.  Аргументы `*args`.
    3.  Именованные аргументы с значениями по умолчанию.
    4.  Аргументы `**kwargs`.

def comprehensive_example(param1, *args, default_param="test", **kwargs):
    print(f"param1: {param1}")
    print(f"args: {args}")
    print(f"default_param: {default_param}")
    print(f"kwargs: {kwargs}")

comprehensive_example(1, 2, 3, 4, custom_key="value", another_key=100)
# Вывод:
# param1: 1
# args: (2, 3, 4)
# default_param: test
# kwargs: {'custom_key': 'value', 'another_key': 100}

Итог для QA: *args — это фундаментальный механизм Python для обработки переменного числа аргументов. Его понимание позволяет эффективно писать гибкие тестовые сценарии, анализировать код продукта и создавать надёжные тестовые фреймворки и утилиты. Это обязательный элемент в арсенале технически подкованного инженера по качеству, работающего с Python-стеком.

Что такое *args? | PrepBro