Параметр **kwarg
Часть раздела Объектно-ориентированное программирование путешествия по Python на Coddy. Урок 43 из 64.
**kwargs — это сокращение от «именованные аргументы». Оно позволяет функции принимать любое количество именованных аргументов (например, пар key=value), не требуя заранее определять их все.
Как это работает:
*args→ собирает дополнительные позиционные аргументы в кортеж**kwargs→ собирает дополнительные именованные аргументы в словарь
Простой пример
Начнём с самого простого примера:
def greet(**kwargs):
print(kwargs)
greet(name="Alice", age=25, country="Australia")Вывод:
{'name': 'Alice', 'age': 25, 'country': 'Australia'}Как видите, **kwargs автоматически собирает все именованные аргументы в словарь.
Использование словаря
Поскольку kwargs уже является словарём, вы можете перебирать его напрямую:
def print_info(**kwargs):
print("Information received:")
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="Bob", age=30, job="Teacher")Вывод:
Information received:
name: Bob
age: 30
job: TeacherСочетание обычных параметров с **kwargs
Можно сочетать обычные параметры с **kwargs:
def create_profile(name, **details):
print(f"Creating profile for: {name}")
print("Additional details:")
for key, value in details.items():
print(f" {key}: {value}")
create_profile("Sarah", age=28, city="London", hobby="Reading")Вывод:
Creating profile for: Sarah
Additional details:
age: 28
city: London
hobby: ReadingПустой **kwargs
Если именованные аргументы не переданы, kwargs будет пустым словарём:
def show_data(**kwargs):
if kwargs:
print("Data:", kwargs)
else:
print("No data provided")
show_data() # Без аргументов
show_data(item="apple") # С аргументамиВывод:
No data provided
Data: {'item': 'apple'}Пример из реальной жизни: класс с **kwargs
Вот как можно использовать **kwargs в классе:
class Person:
def __init__(self, name, **kwargs):
self.name = name
self.details = kwargs
def show_info(self):
print(f"Name: {self.name}")
for key, value in self.details.items():
print(f"{key}: {value}")
person = Person("Alice", age=25, city="New York", job="Engineer")
person.show_info()Вывод:
Name: Alice
age: 25
city: New York
job: EngineerРаспаковка словарей
Вы также можете распаковывать словари при вызове функций:
def display_settings(**kwargs):
for setting, value in kwargs.items():
print(f"{setting} = {value}")
settings = {"debug": True, "verbose": False, "timeout": 30}
display_settings(**settings) # Распаковывает словарьВывод:
debug = True
verbose = False
timeout = 30Основные моменты:
**kwargsсобирает именованные аргументы в словарь: преобразование не требуется, это уже словарь- Имя
kwargsобщепринято — после**можно использовать любое имя - Используй его, если нужна гибкая сигнатура функции
- Отлично подходит для обработки опциональных параметров или настроек конфигурации
Задание
ЛегкоВ этом задании ты реализуешь систему создания объектов Person с полным набором тестов.
Тебе нужно отредактировать только файл person_creator.py, следуя комментариям TODO, которые помогут выполнить реализацию. Файл содержит структуру класса для создания объектов Person с различными свойствами и управления ими.
Попробуйте сами
from person_creator import create_person
# Обработчик всех тестовых случаев
test_case = input()
if test_case == "basic_test":
create_person(name="John", age=25, occupation="Engineer")
# Вывод:
# Person created with properties:
# name: John
# age: 25
# occupation: Engineer
elif test_case == "empty_test":
create_person()
# Вывод:
# Person created with properties:
# (дополнительного вывода нет, поскольку свойства отсутствуют)
elif test_case == "many_properties":
create_person(name="Alice", age=30, occupation="Doctor", city="New York",
country="USA", hobby="Reading", email="alice@example.com")
# Вывод:
# Person created with properties:
# name: Alice
# age: 30
# occupation: Doctor
# city: New York
# country: USA
# hobby: Reading
# email: alice@example.com
elif test_case == "special_characters":
create_person(name="Bob", email="bob@example.com", phone="123-456-7890")
# Вывод:
# Person created with properties:
# name: Bob
# email: bob@example.com
# phone: 123-456-7890
elif test_case == "numeric_keys":
create_person(name="Charlie", age=35, height=175, weight=70)
# Вывод:
# Person created with properties:
# name: Charlie
# age: 35
# height: 175
# weight: 70
elif test_case == "boolean_values":
create_person(name="David", is_student=True, is_employed=False)
# Вывод:
# Person created with properties:
# name: David
# is_student: True
# is_employed: False
elif test_case == "nested_structures":
create_person(name="Eve", hobbies=["Reading", "Swimming", "Coding"],
address={"city": "Boston", "state": "MA", "zip": "02108"})
# Вывод:
# Person created with properties:
# name: Eve
# hobbies: ['Reading', 'Swimming', 'Coding']
# address: {'city': 'Boston', 'state': 'MA', 'zip': '02108'}
elif test_case == "unicode_characters":
create_person(name="José", city="São Paulo", country="Brasil")
# Вывод:
# Person created with properties:
# name: José
# city: São Paulo
# country: Brasil
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Объектно-ориентированное программирование
1Основы ООП
Введение в ООПВнешние файлыКлассы и объектыПараметр selfМетодыАтрибутыМетод-конструктор (__init__)Повторение — простой калькулятор4Наследование
Основы наследованияФункция super()Переопределение методовМножественное наследованиеПорядок разрешения методовПовторение: иерархия сотрудников7Специальные методы
Введение в магические методыПерегрузка операторовМагические методы контейнеровПовторение — пользовательский список10Паттерны проектирования. Часть 1
Введение в паттерны проектированияПаттерн «Одиночка»Паттерн «Фабрика»Паттерн «Наблюдатель»Паттерн «Стратегия»2Декораторы
Введение в декораторыДекоратор свойстваДекоратор статического методаДекоратор метода класса5Полиморфизм
Переопределение методов: повторениеУтиная типизацияАбстрактные классы и методыПроектирование интерфейсовПовторение — калькулятор фигур8Продвинутые концепции ООП
Композиция и наследованиеМиксиныСтатические методы и методы классаДекораторы классовМенеджеры контекста11Паттерны проектирования. Часть 2
Паттерн «Команда»Паттерн «Адаптер»Паттерн «Декоратор»Паттерн «Шаблонный метод»Паттерн «Состояние»Паттерн «Компоновщик»3Свойства классов
Переменные экземпляра и классаДекораторы свойствПриватные атрибутыПовторение — менеджер банковского счёта6Инкапсуляция
Публичные, защищённые и приватные членыМодификаторы доступаСокрытие информацииПродвинутые декораторы свойствПовторение — система учёта студентов12Проект: Система управления библиотекой
Обзор проектаКлассы книг и пользователейСистема выдачи книгФункция поискаИнтерфейс администратораТестирование и интеграцияПотренируйтесь самостоятельно: Онлайн-компилятор Python