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

Во что складируются именованный аргумент в Python

1.3 Junior🔥 61 комментариев
#Python Core

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

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

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

Во что складируются именованные аргументы в Python

Именованные аргументы (keyword arguments) в Python — это один из ключевых механизмов функций. Они передаются в функцию по имени и складируются в специальную структуру. Понимание этого процесса важно для работы с *args и **kwargs.

Основы: как работают именованные аргументы

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

def greet(name, greeting="Hello"):
    print(f"{greeting}, {name}!")

# Именованные аргументы
greet(name="Alice", greeting="Hi")
greet(greeting="Hey", name="Bob")

# Позиционные аргументы
greet("Charlie", "Howdy")

# Смешанные
greet("Dave", greeting="Yo")

Локальные переменные и locals()

Внутри функции, параметры складируются в локальное пространство имён. Мы можем посмотреть через locals():

def example(a, b, c=10):
    print("locals():", locals())

example(1, 2, c=3)
# locals(): {"a": 1, "b": 2, "c": 3}

Это словарь (dict), где ключи — имена переменных.

**kwargs — захватывание именованных аргументов

**kwargs (keyword arguments) захватывает все лишние именованные аргументы в словарь.

def func(a, b, **kwargs):
    print("a:", a)
    print("b:", b)
    print("kwargs:", kwargs)  # Словарь
    print("type(kwargs):", type(kwargs))  # <class 'dict'>

func(1, 2, c=3, d=4, e=5)
# kwargs: {"c": 3, "d": 4, "e": 5}
# kwargs — это обычный словарь!

Порядок параметров функции

В Python есть строгий порядок параметров:

def func(a, b, *args, c=10, d=20, **kwargs):
    pass

# Порядок:
# 1. Позиционные параметры (a, b)
# 2. *args (лишние позиционные)
# 3. Именованные параметры (c, d)
# 4. **kwargs (лишние именованные)

func(1, 2, 3, 4, c=30, e=5)
# args=(3, 4), c=30, kwargs={"e": 5}

Распаковка словаря как именованные аргументы

Можно распаковать словарь в именованные аргументы используя **:

def greet(name, greeting="Hello"):
    print(f"{greeting}, {name}!")

params = {"name": "Alice", "greeting": "Hi"}
greet(**params)
# Эквивалентно: greet(name="Alice", greeting="Hi")

Примеры из реальной жизни

1. Конструктор с гибкими параметрами:

class User:
    def __init__(self, name, email, **extra):
        self.name = name
        self.email = email
        self.phone = extra.get("phone")
        self.bio = extra.get("bio")

user = User(
    name="Alice",
    email="alice@example.com",
    phone="123-456",
    bio="Developer"
)

2. Прокси функция:

def log_and_call(func, *args, **kwargs):
    print(f"Calling {func.__name__}")
    print(f"kwargs={kwargs}")
    return func(*args, **kwargs)

def add(a, b):
    return a + b

result = log_and_call(add, 10, b=20)
# kwargs={'b': 20}
# result: 30

3. Декоратор с валидацией:

def validate_params(**validators):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for param_name, validator in validators.items():
                if param_name in kwargs:
                    if not validator(kwargs[param_name]):
                        raise ValueError(f"Invalid {param_name}")
            return func(*args, **kwargs)
        return wrapper
    return decorator

@validate_params(
    age=lambda x: 0 < x < 150,
    email=lambda x: "@" in x
)
def create_user(name, **kwargs):
    print(f"Creating {name}")

create_user("Alice", age=30, email="alice@example.com")

4. API клиент:

class APIClient:
    def __init__(self, base_url, **default_headers):
        self.base_url = base_url
        self.default_headers = default_headers
    
    def request(self, method, endpoint, **kwargs):
        headers = {**self.default_headers, **kwargs.get("headers", {})}
        # Объединяем заголовки
        url = f"{self.base_url}{endpoint}"
        return self._make_request(method, url, headers=headers, **kwargs)

client = APIClient(
    "https://api.example.com",
    Authorization="Bearer token123"
)
client.request("GET", "/users", headers={"Custom": "value"})

Внутреннее представление

Когда вы вызываете функцию с именованными аргументами:

def func(a, b=10, **kwargs):
    pass

func(1, b=20, c=30)

Python создаёт локальное пространство имён:

locals_dict = {
    "a": 1,
    "b": 20,
    "kwargs": {"c": 30}  # Остальные именованные
}

Все переменные функции хранятся в этом словаре.

Итог

Именованные аргументы складируются в локальное пространство имён функции как словарь. При использовании **kwargs они явно собираются в один словарь. Это мощный механизм для создания гибких функций и API. Ключевые моменты: **kwargs — это обычный dict, порядок сохраняется (Python 3.6+), словари можно распаковывать в функции используя **, это инструмент для создания гибких интерфейсов.

Во что складируются именованный аргумент в Python | PrepBro