**kwarg
Coddy Python 여정의 Object Oriented Programming 섹션에 포함된 레슨 — 64개 중 43번째.
**kwargs는 "keyword arguments"(키워드 인자)의 줄임말입니다. 이는 함수가 모든 인자를 미리 정의하지 않고도 임의의 개수의 이름이 있는 인자(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라는 이름은 관례적인 것입니다 -**뒤에 어떤 이름이든 사용할 수 있습니다- 유연한 함수 시그니처를 원할 때 사용하세요
- 선택적 매개변수나 구성 설정을 처리하는 데 유용합니다
챌린지
쉬움이 챌린지에서는 포괄적인 테스트 커버리지를 갖춘 인물 생성 시스템을 구현합니다.
구현을 안내하는 TODO 주석에 따라 person_creator.py 파일만 수정하면 됩니다. 이 파일에는 다양한 속성을 가진 인물 객체를 생성하고 관리하기 위한 클래스 구조가 포함되어 있습니다.
치트 시트
**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")일반 매개변수, *args, 그리고 **kwargs를 결합합니다:
class Logger:
def log(self, level, *messages, **options):
timestamp = options.get('timestamp', False)
color = options.get('color', 'default')
if timestamp:
print("[2024-01-01 12:00:00]", end=" ")
print(f"[{level}]", end=" ")
for message in messages:
print(message, end=" ")
logger = Logger()
logger.log("INFO", "User", "logged", "in", timestamp=True, color="green")**를 사용하여 메서드를 호출할 때 딕셔너리를 언패킹합니다:
settings = {"debug": True, "verbose": False, "log_level": "INFO"}
config = Config(**settings) # 딕셔너리를 언패킹합니다딕셔너리 메서드를 사용하여 **kwargs 값에 접근합니다:
def get_setting(self, key, default=None):
return self.settings.get(key, default)
# 모든 kwargs를 반복합니다
for key, value in self.settings.items():
print(f"{key} = {value}")직접 해보기
from person_creator import create_person
# 종합적인 테스트 케이스 처리기
test_case = input()
if test_case == "basic_test":
create_person(name="John", age=25, occupation="Engineer")
# 출력:
# 속성과 함께 생성된 사람:
# name: John
# age: 25
# occupation: Engineer
elif test_case == "empty_test":
create_person()
# 출력:
# 속성과 함께 생성된 사람:
# (속성이 없으므로 추가 출력 없음)
elif test_case == "many_properties":
create_person(name="Alice", age=30, occupation="Doctor", city="New York",
country="USA", hobby="Reading", email="alice@example.com")
# 출력:
# 속성과 함께 생성된 사람:
# 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")
# 출력:
# 속성과 함께 생성된 사람:
# 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)
# 출력:
# 속성과 함께 생성된 사람:
# name: Charlie
# age: 35
# height: 175
# weight: 70
elif test_case == "boolean_values":
create_person(name="David", is_student=True, is_employed=False)
# 출력:
# 속성과 함께 생성된 사람:
# 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"})
# 출력:
# 속성과 함께 생성된 사람:
# 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")
# 출력:
# 속성과 함께 생성된 사람:
# name: José
# city: São Paulo
# country: Brasil
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.