- kwargs와 args란..?
- 파이썬에서 함수에 전달할 가변 인자를 다루는 방법들
- args : 함수 전달된 위치 인자를 의미. * 와 args 함께 사용, 함수에 전달된 위치 인자들을 '튜플'형태로 묶어주는 역할
- kwargs : 함수에 전달될 키워드 인자를 의미. * 와 kwargs 함께 사용, 함수에서 여러 개의 키워드 인자들을 '딕셔너리' 형태로 받아 처리할 수 있도록 해준다.
=> 함수나 클래스에서 인자의 개수나 이름을 미리 정해놓지 않고, 딕셔너리 형태로 인자를 받아온다면, 함수나 클래스의 확장성과 재사용성이 높아짐. 새로운 인자가 추가되어도 기존 코드를 수정할 필요 없이 딕셔너리에 새로운 키와 값을 추가하면 된다.
def my_function(*args):
for arg in args:
print(arg)
my_function(1, 2, 3) #출력 : 1,2,3
def my_function(**kwargs):
for key, value in kwargs.items():
print(key, value)
my_function(name='Harry', age='17', school='Hogwart')
#출력
#name Harry
#age 17
#school Hogwart
- 패킹(packing)과 언패킹(unpacking)이란?
- 말 그대로 요소들을 묶거나 풀오주는 것
- 패킹 : 여러 개의 값을 하나의 변수에 묶어서 저장, 변수는 '튜플' 형태로 저장
- 언패킹 : 패킹된 변수를 다시 여러 개의 변수로 분리하는 것. 이 때 변수 개수는 패킹된 값의 개수와 동일해야 함
#패킹 예시
my_tuple = 1,2,3 #패킹
print(type(my_tuple)) #<class 'tuple'>
#언패킹 예시
a,b,c = my_tuple #a=1, b=2, c=3
- 클래스에서 활용한 **kwargs
class Profile:
def __init__(self, **kwargs):
self.name = kwargs.get("name")
self.age = kwargs.get("age")
self.height = kwargs.get("height")
self.weight = kwargs.get("weight")
self.birthday = kwargs.get("birthday")
self.email = kwargs.get("email")
self.phone = kwargs.get("phone")
self.address = kwargs.get("address")
self.gender = kwargs.get("gender")
def print_profile(self,):
print(f"name : {self.name}")
print(f"age : {self.age}")
print(f"height : {self.height}")
print(f"weight : {self.weight}")
print(f"birthday : {self.birthday}")
print(f"email : {self.email}")
print(f"phone : {self.phone}")
print(f"address : {self.address}")
print(f"gender : {self.gender}")
profile_list = [
{
"name": "해리포터",
"age": "17",
"height": "173",
"weight": "67",
"birthday": "930101",
"email": "email@test.com",
"phone": "010-1234-5678",
"address": "Hogwarts",
"gender": "남자"
},
{
"name": "제임스포터",
"age": "17",
"height": "173",
"weight": "67",
"birthday": "930101",
"email": "email@test.com",
"phone": "010-1234-5678",
"address": "Hogwarts",
"gender": "남자"
},
{
"name": "릴리포터",
"age": "17",
"height": "173",
"weight": "67",
"birthday": "930101",
"email": "email@test.com",
"phone": "010-1234-5678",
"address": "Hogwarts",
"gender": "여자"
},
{
"name": "스네이프포터",
"age": "17",
"height": "173",
"weight": "67",
"birthday": "930101",
"email": "email@test.com",
"phone": "010-1234-5678",
"address": "Hogwarts",
"gender": "남자"
}
]
result = []
for profile_data in profile_list:
result.append(Profile(**profile_data))
for i in result:
i.print_profile()
- 위 코드는 Profile 클래스를 정의하고 profile_list 리스트의 각 디셔너리 요소를 Profile클래스의 인스턴스로 생성하여 result리스트에 추가했다. result 리스트의 각 요소에 대해 print_profile 메소드를 호출!
Profile 클래스는 **kwargs를 매개변수로 받아서, 딕셔너리로 전달된 인자를 키워드 인자로 받아 인스턴스 변수로 저장
- 'kwargs.get()'은 딕셔너리에서 키를 이용해 값을 가져오는 메소드
kwargs.get(key, default) 형태로 사용하고 default에는 해당 키가 없을 경우 반환할 기본값을 지정한다.
- 빈 result 리스트에 객체를 생성하여 append할 때도 패킹을 하여 profile_data의 모든 키-값 쌍을 전달함
=> 간결하고 유연한 코드를 만들 수 있음
+) 생성자에 필요한 모든 매개변수를 지정해주는 방식과 비교해보기!
class Profile:
def __init__(self, name, age, height, weight, birthday, email, phone, address, gender):
#self.name = name 등등..
my_profile_list = [
Profile("해리포터", "17", "173", "67", "930101", "email@test.com",
"010-1234-5678", "Hogwarts", "남자"),
Profile("릴리포터", "17", "165", "45", "930101", "email@test.com",
"010-1234-5678", "Hogwarts", "여자"),
Profile("제임스포터", "17", "173", "67", "930101",
"email@test.com", "010-1234-5678", "Hogwarts", "남자"),
Profile("스네이프포터", "17", "173", "67", "930101",
"email@test.com", "010-1234-5678", "Hogwarts", "남자")
]
두 코드 모두 같은 기능을 수행하지만, 이 코드는 생성자에 필요한 모든 매개변수를 지정해야 함.
kwargs와 딕셔너리 활용하여 딕셔너리 형태로 데이터를 전달한다면, 생성자에 필요한 매개변수만 딕셔너리에 포함시키면 됨. 또한 Profile 클래스에 새로운 매개변수를 추가하는 경우에는 기존 코드 수정없이 딕셔너리에 새로운 키와 값을 추가하면 된다. 따라서 kwargs를 활용한 코드가 더 유연성과 확장이 높다고 볼 수 있다..
'Python' 카테고리의 다른 글
Python < 타입별 메서드 정리 > (2) | 2023.04.16 |
---|---|
Python <코드 컨벤션, 정규 표현식, 여러가지 모듈> (0) | 2023.04.04 |
python 타입힌트와 데코레이터 여러 예시 (0) | 2023.04.01 |
파이썬 기초문법 8 <예외처리, finally, 모듈, 패키지> (0) | 2023.03.23 |
파이썬 기초문법7 <메소드 오버로딩, pass, super> (0) | 2023.03.23 |